• ベストアンサー

C言語 プログラム 解決法

下記のプログラムのif文なんですが、[0 0 0]と入力しても止まりません。。どういう風に書けば[0 0 0]でブレークされるのでしょうか? お願いします。 --------------------------------------------------------------------- for(i=0;i<127;i++){ scanf("%s %f %c",peason[i].name,&peason[i].height,&peason[i].bloodType); if(peason[i].name == 0 && peason[i].height == 0 && peasoon[i].bloodType == '0' ) break; }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

まずは自力でデバグする能力を身に着けましょう。 今回は、条件を少なくしてどの判定にミスがあるのかを判断できれば自力解決へとつながります。 試してないからわかりませんが今回は nameを"0"で判定すべき???

tomato1414
質問者

お礼

ケアレスミスすいません! なかなかうまくいかなくてperson_info[i].name[0]='0'でやっとうまくいきました。 ありがとうございます。

その他の回答 (5)

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.6

>あとよければ何が3を返すのかを知りたいです!いまいち3を返すってのが理解できません。 もうお分かりかもしれませんが、scanf()で%指示に対応して割り当てに成功した数です。通常scanf関数群を使う場合、簡単なテストの場合を除き、戻り値の確認は必須です。例えば、 int a, b; if (scanf("%d%d", &a, &b) < 2) といった場合、入力に"100 20"とすれば戻り値は2が、"100 abc"とかだと1が戻されるはずです。この場合変数bの内容は不定ですし、続けて入力を処理するなら、無効な入力を読み飛ばすなりの処理を行う必要があります。 Cのscanf()関数群は比較的取り扱いの難しい関数なので、仕様書を確認しながら使う必要があります。型により変換指示も細かいですし、ポインタは完全に理解しておかなければならないでしょう。

回答No.5

for(i=0;i<127;i++){ if(feof(stdin)) break; //scanfの前にEOFの判定をすること if (scanf("%s %f%*[\ ]%c",peason[i].name,&peason[i].height,&peason[i].bloodType) != 3) { //3つの項目に変換出来ない場合は printf("入力が足りません\n"); //を表示して scanf("%*[^\n]%*c"); //改行も含めて読み捨てて continue; //ループの先頭からやり直し } if ((strcmp(peason[i].name,"0") == 0) && (peason[i].height == 0.0) && (peason[i].bloodType == '0')) break; }

回答No.4

%cで入力すると、空白文字が読み込まれるので、以降のデータと読み込み先の変数の対応がすれてしまいます。 peason[1].nameに値が正しく入力されていますか。

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.3

>scanf("%s %f %c",peason[i].name,&peason[i].height,&peason[i].bloodType); scanf()の戻り値を確認すべきです。この場合三つとも正しく変換できたときだけ3を返しますので、!=3でbreakとするしかないでしょう。それ未満の値を返した場合、それに対応する変数に値は設定されません。ですから、その後でその変数の値を評価することは出来ません。 それと不用意に"%s"を使ってはいけません。バッファオーバーフローの元凶のひとつです。もう少しフォローが必要なのならfgets()と組み合わせれば、エラーリカバリも可能になるように思います。 >if(peason[i].name == 0 && peason[i].height == 0 && peasoon[i].bloodType == '0' ) break; 矛盾ありまくり。nameは"%s"なのですからcharの配列のはずです。もしchar *なのならこれ自体はありえますが、NULLポインタをさすことになります。 heightは"%f"なのですから記述するなら0.0ですが、浮動少数では誤差を考慮に入れて判定すべきです。

tomato1414
質問者

お礼

いろいろご指摘ありがとうございます! なかなか初心者なものでうまくいかなくて。。 あとよければ何が3を返すのかを知りたいです!いまいち3を返すってのが理解できません。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

nameがchar型の配列ならば、先頭要素name[0]が'0'かどうか チェックすればよいのではないでしょうか。 # どうでもいい話だが、「人」を表わす構造体なら「person」であろう。

tomato1414
質問者

お礼

ほんとにその通りでした。。 しかもスペルミスまで><笑 助かりました、ありがとうございました!

関連するQ&A