こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

永久ループ・・・

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

int main(void)
{
int i;

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

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

投稿日時 - 2001-10-21 03:43:47

QNo.154748

暇なときに回答ください

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

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

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

投稿日時 - 2001-10-21 03:58:37

お礼

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

投稿日時 - 2001-10-21 08:02:47

ANo.1

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

同じような質問がありますので”scanf”で検索して見て下さい。
少し慣れると、scanfという関数は使わないようです。
参考URLなど参考になるでしょう。
特に、他人に使わせるソフトにはscanfは使用できません。何を入力するか解りませんから、、、
では。

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=88787

投稿日時 - 2001-10-21 07:18:03

お礼

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

投稿日時 - 2001-10-21 07:56:29