最速怪談選手権

どうも、最近C言語の勉強を始めた超初心者です。

int main(void)
{
int i;

for(;;){
printf("桁数を入力してください。:");
scanf("%d",&i);
if(i<=12)
break;
else puts("もう一度入力してください。");
continue;
}
return(0);
}

上のソース、i<=12の条件を満たさなければループを繰り返すというプログラムなんですけど、数値を入力した場合は思った通りに挙動するのですが、文字や文字列を入力すると永久ループになります。scanf関数で返値を受け取って判定するなどいろいろ試したのですが、どうしても永久ループになってしまいます。
どうしてか教えてください。お願いします。

A 回答 (2件)

これはscanf()の動作としては仕方のないことなのです。


scanf()は%d指定時に数字以外の入力があると暴走します。
したがって、動作の保障が必要なら何らかの手段を講じてやらなければなりません。
例えば一旦文字列として取り込み、数字以外の文字が混じっていないか判定した後に数値に変換するといった具合です。(isdigit()やatoi()を用いて)

#これをscanf()のバグと呼ぶ人もいますが、改修されないところをみると仕様なのでしょうね。
    • good
    • 0
この回答へのお礼

悩んでいたのが、情けなるくらい簡単に謎が解けました。^^;
有り難うございました。
しかし、こんな初歩の初歩で躓いてるようでは先が思いやられます・・・

お礼日時:2001/10/21 08:02

同じような質問がありますので”scanf”で検索して見て下さい。


少し慣れると、scanfという関数は使わないようです。
参考URLなど参考になるでしょう。
特に、他人に使わせるソフトにはscanfは使用できません。何を入力するか解りませんから、、、
では。

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=88787
    • good
    • 0
この回答へのお礼

以前に本でscanf関数とgotoはあまり使わない方がいいと書いてありました。scanfは何で使わない方がいいのかさっぱり理解できませんでしたが、これで少しだけ納得!
有り難うございました。

お礼日時:2001/10/21 07:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!