- ベストアンサー
永久ループ・・・
どうも、最近C言語の勉強を始めた超初心者です。 int main(void) { int i; for(;;){ printf("桁数を入力してください。:"); scanf("%d",&i); if(i<=12) break; else puts("もう一度入力してください。"); continue; } return(0); } 上のソース、i<=12の条件を満たさなければループを繰り返すというプログラムなんですけど、数値を入力した場合は思った通りに挙動するのですが、文字や文字列を入力すると永久ループになります。scanf関数で返値を受け取って判定するなどいろいろ試したのですが、どうしても永久ループになってしまいます。 どうしてか教えてください。お願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
これはscanf()の動作としては仕方のないことなのです。 scanf()は%d指定時に数字以外の入力があると暴走します。 したがって、動作の保障が必要なら何らかの手段を講じてやらなければなりません。 例えば一旦文字列として取り込み、数字以外の文字が混じっていないか判定した後に数値に変換するといった具合です。(isdigit()やatoi()を用いて) #これをscanf()のバグと呼ぶ人もいますが、改修されないところをみると仕様なのでしょうね。
その他の回答 (1)
- brogie
- ベストアンサー率33% (131/392)
同じような質問がありますので”scanf”で検索して見て下さい。 少し慣れると、scanfという関数は使わないようです。 参考URLなど参考になるでしょう。 特に、他人に使わせるソフトにはscanfは使用できません。何を入力するか解りませんから、、、 では。
お礼
以前に本でscanf関数とgotoはあまり使わない方がいいと書いてありました。scanfは何で使わない方がいいのかさっぱり理解できませんでしたが、これで少しだけ納得! 有り難うございました。
お礼
悩んでいたのが、情けなるくらい簡単に謎が解けました。^^; 有り難うございました。 しかし、こんな初歩の初歩で躓いてるようでは先が思いやられます・・・