質問: ``` #include #include #define STRING_SIZE 200 int main(void) { int val; int sum=0; int cnt=0; char FileName[14]; char string[STRING_SIZE]; FILE *fp; printf("入力ファイル名>>>"); scanf("%s",FileName); if((fp=fopen(FileName,"r"))==NULL) { printf("ファイルが見つかりません。---%s\n",FileName); exit(EXIT_FAILURE); } cnt=0; while(fgets(string,STRING_SIZE,fp)) { sscanf(string,"%d",&val); sum+=val; cnt++; } if(cnt>0) { printf("合計=%d 平均値=%g\n",sum,(double)sum/cnt); } fclose(fp); return EXIT_SUCCESS; } indata.dat abcdef ghijkl mnopqr stuvwx yz ``` 「C言語によるプログラミング基礎編」に書いてあったのですが、実行する度に結果の数字が違うのはなぜでしょうか。 Lubuntuで作業しています。gccでコンパイルしています。
回答: > > sscanf(string,"%d",&val); > > > ここで数値を読み取ろうとしているのに、indata.datの中身が数値でないので、読み取りに失敗しています。 読み取りに失敗したため`val`には何も設定されず、初期化もされていないので不定値がsumに加算されることになり、意図しない結果になってしまうのです。 `sscanf`は戻り値として読み取った個数を返します。上記sscanfでは変数は1個だけなので、正しく読み取れれば`1`が返ってきます。ですので、戻り値をチェックして`1`の時だけ加算処理をするようにしてください。 sscanfで正しく読み取れなかったら、「不正なデータです」のように表示させると良いかもしれません。