前提・実現したいこと
2020,3,19,愛知県,226,188,32,6
年、月、日、県、感染者数、入院者数、退院者数、死亡者数
この形で与えられるデータを構造体に格納して表示すること。
発生している問題・エラーメッセージ
00: ELF
Segmentation fault
該当のソースコード
C言語 ``` コード ```#include<stdio.h> #include<stdlib.h> #include<string.h> #define FILEBUFSIZE 1024 // 1行の最大文字長 #define MAXSAMPLENUM 8196 // 読み込むことができる最大行数 #define MAX_NUM 32 // 1行に記述される最大要素数 #define TOKLEN 64 // 要素の最大文字長 struct infection{ int year; int month; int day; char prefecture[20]; int infected; int hospital; int discharge; int death; }; struct infection inf[MAXSAMPLENUM]; int sampleNum=0; char lines[MAXSAMPLENUM][FILEBUFSIZE]; int k=0; void readFile(char filename[]) { FILE *fp; char buf[FILEBUFSIZE]; // 読み込んだデータを一時的に格納する文字配列 if ((fp = fopen(filename, "r")) == NULL) { printf("Cannot open file: %s\n", filename); exit(1); } while (! feof(fp)) { // ファイルの終わりまで if (fgets(buf, FILEBUFSIZE, fp) != NULL) { // まずはbufに読み込んでから strcpy(lines[sampleNum], buf); // 格納用配列にコピーする ++sampleNum; } } fclose(fp); } void str2infection(char str[]) { int i, j; char *token[MAX_NUM]; /* strtok()の第2引数で順に区切って要素に分割し、char *token[] に格納 */ for (i=0; i < MAX_NUM; i++) { if ((token[i] = strtok(str, ",")) == NULL) { break; } str = NULL; /* 2回目以降は第1引数にヌルポインタを指定する; strtok()の仕様 */ } /* 各tokenに何が入ったかを確認! */ for (j=0; j < i; j++) { printf("%02d: %s\n", j, token[j]); } /* 分割した要素から、各データを取り出して格納 */ inf[k].year = atoi(token[0]); // 0: 年 inf[k].month = atoi(token[1]); // 1: 月 inf[k].day = atoi(token[2]); // 2: 日 strcpy(inf[k].prefecture,token[3]); //県名 inf[k].infected = atoi(token[4]); // 4: 感染者数 inf[k].hospital = atoi(token[5]); // 5: 入院者数 inf[k].discharge = atoi(token[6]); // 6: 退院者数 inf[k].death = atoi(token[7]); // 7: 死亡者数*/ printf("%04d\t%02d\t%02d\t%s\t%03d\t%03d\t%03d\t%03d\n", inf[k].year, inf[k].month, inf[k].day, inf[k].prefecture, inf[k].infected,inf[k].hospital,inf[k].discharge,inf[k].death); k++; } int main(int argc,char *argv[]){ int i; if(argc < 2){ printf("Please specify input file name(s)\n"); exit(1); } for(i=0;i<argc;i++){ readFile(argv[i]); } for(i=0;i<sampleNum;i++){ str2infection(lines[i]); } return 0; }```ここに言語を入力 コード ``` ### 試したこと tokenという配列にはきちんと値が入っているのは確認できました。 そして構造体にtokenから値を代入すると同じようなエラーが起きます ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。
このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
それと、そのコードを実行した場合の出力内容も提示しましょう
00:ELF
Segmentation fault
と出力されます
> 00:ELF
> Segmentation fault
なのに
> tokenという配列にはきちんと値が入っているのは確認できました。
というのはどうやって確認できたのですか?
/* 分割した要素から、各データを取り出して格納 */
inf[k].year = atoi(token[0]); // 0: 年
inf[k].month = atoi(token[1]); // 1: 月
inf[k].day = atoi(token[2]); // 2: 日
strcpy(inf[k].prefecture,token[3]); //県名
inf[k].infected = atoi(token[4]); // 4: 感染者数
inf[k].hospital = atoi(token[5]); // 5: 入院者数
inf[k].discharge = atoi(token[6]); // 6: 退院者数
inf[k].death = atoi(token[7]); // 7: 死亡者数*/
printf("%04d\t%02d\t%02d\t%s\t%03d\t%03d\t%03d\t%03d\n",
inf[k].year, inf[k].month, inf[k].day,
inf[k].prefecture,
inf[k].infected,inf[k].hospital,inf[k].discharge,inf[k].death);
k++;
この部分を除いたプログラムを実行したところ
for (j=0; j < i; j++) {
printf("%02d: %s\n", j, token[j]);
}
この部分がきちんと動きtokenの値がきちんと出たからです
コードの中には大量のprintfがありますが、それらは全く実行されることはない、ということでしょうか
繰り返しますが、実行を開始してからの出力内容を提示してください
printfは全く実行されません
00:ELF
Segmation fault
のみが表示されます
> この部分を除いたプログラムを実行したところ
きちんと出たところだけ見て、きちんと出ていない部分を無視した、などということはないですか?
私の手元では、
(ここからプログラム開始)
00: ELF
00: py
00:
00: @
00: @
00: @
00: @
00: H`f
00: @
00: @
00: H`f
00: @
00: @
00: @
00: @
00: @
00: @
00: @
00: rtok@@GLIBC_2.2.5
00:
00: @
00: @
00: 2020
01: 3
02: 19
03: 愛知県
04: 226
05: 188
06: 32
07: 6
などというかなりメチャクチャなものが出力されます。(最後だけはまっとうですが)
00: 2020
01: 4
02: 6
03: 埼玉県
04: 195
05: 168
06: 23
07: 4
00: 2020
01: 4
02: 6
03: 北海道
04: 194
05: 44
06: 141
07: 9
00: 2020
01: 4
02: 6
03: 京都府
04: 119
05: 101
06: 18
07: 0
00: 2020
01: 4
02: 6
03: 福岡県
04: 113
05: 107
06: 6
07: 0
00: 2020
01: 4
02: 6
03: 茨城県
04: 71
05: 68
06: 1
07: 2
00: 2020
01: 4
02: 6
03: 福井県
04: 57
05: 54
06: 1
07: 2
00: 2020
01: 4
02: 6
03: 岐阜県
04: 51
05: 48
06: 2
07: 1
00: 2020
01: 4
02: 6
03: 石川県
04: 45
05: 40
06: 5
07: 0
00: 2020
01: 4
02: 6
03: 高知県
04: 34
05: 22
06: 12
07: 0
00: 2020
01: 4
02: 6
03: 大分県
04: 32
05: 24
06: 8
07: 0
00: 2020
01: 4
02: 6
03: 新潟県
04: 32
05: 21
06: 11
07: 0
中盤から張り付けしましたがおそらくおかしいところはないと思います....
> 中盤から張り付けしましたがおそらくおかしいところはないと思います....
最初から全部確認してみて下さい。
全て確認しましたがすべて正常に反映されていました
もしかして「データファイルとして読ませた分は」全て確認しました...になってませんでしたか?
今回は、既におわかりのように、読ませるべきでないファイルを読ませていて、そこで引っかかっていたわけです。目の前で起こった現象を、自分の都合のいいようにではなく、あるがままに解釈する練習をした方がいいと思います。
回答2件
あなたの回答
tips
プレビュー