回答編集履歴
4
終端文字の追加
    
        answer	
    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,5 +84,5 @@ | |
| 83 84 | 
             
            実行結果
         | 
| 84 85 | 
             
            ```text
         | 
| 85 86 | 
             
            [JM] [田中 なおき           ] [M] [26] [52] [36]
         | 
| 86 | 
            -
            [JM] [田中 なおき | 
| 87 | 
            +
            [JM] [田中 なおき     ] [M] [26] [52] [36]
         | 
| 87 88 | 
             
            ```
         | 
3
要素数の修正
    
        answer	
    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[ | 
| 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
追記
    
        answer	
    CHANGED
    
    | @@ -30,3 +30,58 @@ | |
| 30 30 | 
             
            }
         | 
| 31 31 | 
             
            ```
         | 
| 32 32 | 
             
            性別を M F ではなく、男女に修正しました。
         | 
| 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 | 
            +
            ```
         | 
1
性別の表示の修正
    
        answer	
    CHANGED
    
    | @@ -15,16 +15,18 @@ | |
| 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 ではなく、男女に修正しました。
         | 
