回答編集履歴
4
終端文字の追加
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] [田中 なおき
|
87
|
+
[JM] [田中 なおき ] [M] [26] [52] [36]
|
87
88
|
```
|
88
89
|
|
3
要素数の修正
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[2
|
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
追記
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
性別の表示の修正
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
|
|