回答編集履歴

4

終端文字の追加

2022/07/24 15:52

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -67,6 +67,7 @@
67
67
 
68
68
  memcpy(class, str2, 4);
69
69
  memcpy(name, &str2[4], 20);
70
+ name[20] = '\0';
70
71
  memcpy(gen, &str2[24], 2);
71
72
  memcpy(num, &str2[26], 3);
72
73
  jap = atoi(num);
@@ -83,6 +84,6 @@
83
84
  実行結果
84
85
  ```text
85
86
  [JM] [田中 なおき ] [M] [26] [52] [36]
86
- [JM] [田中 なおき     ] [M] [26] [52] [36]
87
+ [JM] [田中 なおき     ] [M] [26] [52] [36]
87
88
  ```
88
89
 

3

要素数の修正

2022/07/24 15:46

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -50,7 +50,7 @@
50
50
  char str2[] = "JM田中 なおき    M026052036\n";
51
51
  // 全全全全全全全全全全全全全123456789
52
52
  // 1 2 1 2 3 4 5 6 7 8 9 10
53
- char class[5] = "", name[21] = "", gen[3] = "", num[4] = "";
53
+ char class[5] = "", name[23] = "", gen[3] = "", num[4] = "";
54
54
  int jap, math, eng;
55
55
 
56
56
  memcpy(class, str1, 2);

2

追記

2022/07/24 15:42

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -31,3 +31,58 @@
31
31
  ```
32
32
  性別を M F ではなく、男女に修正しました。
33
33
 
34
+ **追記**
35
+ 質問のコードに `#define _CRT_SECURE_NO_WARNINGS` があることから、
36
+ OS が Windows で、コンパイラが Visual C++ だとすると、
37
+ 文字コードは Shift-JIS でしょう。
38
+ それだと全角文字は 2バイトになります。
39
+ memcpy はバイト数を指定してバイト列をコピーするものです。
40
+ ```C
41
+ #include <stdio.h> // printf
42
+ #include <stdlib.h> // atoi
43
+ #include <string.h> // memcpy
44
+
45
+ int main(void)
46
+ {
47
+ // 01234567890123456789012345678901234
48
+ char str1[] = "JM田中 なおき M026052036\n";
49
+ // 12全全1全全全12345678901.123456789
50
+ char str2[] = "JM田中 なおき    M026052036\n";
51
+ // 全全全全全全全全全全全全全123456789
52
+ // 1 2 1 2 3 4 5 6 7 8 9 10
53
+ char class[5] = "", name[21] = "", gen[3] = "", num[4] = "";
54
+ int jap, math, eng;
55
+
56
+ memcpy(class, str1, 2);
57
+ memcpy(name, &str1[2], 22);
58
+ memcpy(gen, &str1[24], 1);
59
+ memcpy(num, &str1[25], 3);
60
+ jap = atoi(num);
61
+ memcpy(num, &str1[28], 3);
62
+ math = atoi(num);
63
+ memcpy(num, &str1[31], 3);
64
+ eng = atoi(num);
65
+ printf("[%s] [%s] [%s] [%d] [%d] [%d]\n",
66
+ class, name, gen, jap, math, eng);
67
+
68
+ memcpy(class, str2, 4);
69
+ memcpy(name, &str2[4], 20);
70
+ memcpy(gen, &str2[24], 2);
71
+ memcpy(num, &str2[26], 3);
72
+ jap = atoi(num);
73
+ memcpy(num, &str2[29], 3);
74
+ math = atoi(num);
75
+ memcpy(num, &str2[32], 3);
76
+ eng = atoi(num);
77
+ printf("[%s] [%s] [%s] [%d] [%d] [%d]\n",
78
+ class, name, gen, jap, math, eng);
79
+ }
80
+ ```
81
+ char配列は `= ""` で初期さすると、全バイトが '\0' で初期化されます。
82
+
83
+ 実行結果
84
+ ```text
85
+ [JM] [田中 なおき ] [M] [26] [52] [36]
86
+ [JM] [田中 なおき     ] [M] [26] [52] [36]
87
+ ```
88
+

1

性別の表示の修正

2022/07/24 02:03

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -15,17 +15,19 @@
15
15
  printf("ファイルオープン失敗\n");
16
16
  return -1;
17
17
  }
18
+ static const char *s[] = { "男", "女" };
18
19
  while (fgets(str, 256, fp) != NULL)
19
20
  if (sscanf(str, "%2s%s%s%1s%3d%3d%3d",
20
21
  class, name, name2, gen, &jap, &math, &eng) == 7)
21
22
  printf(" %s\t %s %s\t %s\t %03d\t %03d\t %03d\t %03d\n",
22
- class, name, name2, gen, jap, math, eng, jap + math + eng);
23
+ class, name, name2, s[*gen=='F'], jap, math, eng, jap + math + eng);
23
24
  else if (sscanf(str, "%2s%s%1s%3d%3d%3d",
24
25
  class, name, gen, &jap, &math, &eng) == 6)
25
26
  printf(" %s\t %s\t %s\t %03d\t %03d\t %03d\t %03d\n",
26
- class, name, gen, jap, math, eng, jap + math + eng);
27
+ class, name, s[*gen=='F'], jap, math, eng, jap + math + eng);
27
28
  else printf("wrong data");
28
29
  fclose(fp);
29
30
  }
30
31
  ```
32
+ 性別を M F ではなく、男女に修正しました。
31
33