質問: fopen("phonefile.txt","r"); int m; for(m=0; m<=n; m++) { fscanf(fpn, "%s", &data[m][0]); fscanf(fpa, "%s", &data[m][1]); fscanf(fpp, "%s", &data[m][2]); } fclose(fpn); fclose(fpa); fclose(fpp); printf("全%d件の登録を読み込みます\n", n); for(m=0; m<=n; m++) { printf("名前:%s 住所:%s 電話番号:%s\n", data[m][0], data[m][1], data[m][2]); } } } ``` ### 試したこと ### 補足情報(FW/ツールのバージョンなど)
回答: scanf の "%s" は、char の配列に、入力文字列を読み込む 変換指定子です。十分な大きさの配列を用意してください。 プログラム中の文字列は最後に '\0' が付きます。 char data[3] では、2文字しか入りません。 scanf は、入力を読み込む変数へのポインタを指定しないといけ ないのですが、変数が配列の場合、配列は自動的に配列の先頭要素 へのポインタに変換されるので & を付ける必要はありません。 次のプログラムについて、よく考えてみてください。 ``` #include int main(void) { char name[32]; printf("name: "); scanf("%31s", name); printf(" name = '%s'\n", name); char names[3][32]; for (int i = 0; i < 3; i++) { printf("names[%d] = ", i); scanf("%31s", names[i]); } for (int i = 0; i < 3; i++) printf(" names[%d] = '%s'\n", i, names[i]); return 0; } ```