
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
http://www9.plala.or.jp/sgwr-t/c/sec05.html
の「5-4.scanf()の注意事項」を読みましょう。
>scanfは一度しか実行されずループし続けます
いいえ。scanfは実行されています。
「2度目以降のscanfを呼んだ時、入力バッファに変な物(%dとして受け付けない物)があると、scanfは入力バッファをそのままにして、何もしないで戻ってくる」ので「まるでscanfが実行されていないように見える」だけです。
scanfは「変換できた個数を返す」と言う仕様になっているので
while (1) {
int key;
if (feof(stdin)) break; //EOFの時は終了
if (scanf("%d", &key) != 1) { //予期しない入力なら
scanf("%*[^\n]%*c"); //改行も含めて読み飛ばす
} else { //変換できたなら
if (key == 1) break; //1なら終了
}
}
など、scanfの戻り値を確認すると良いでしょう。
よく「scanfは、初心者が絶対に使ってはいけない関数」などと暴言を吐く人が居ますが、そんな事はありません。
・scanfの戻り値をちゃんと確認すれば予期せぬ入力の判定は可能
・予期せぬ入力を読み飛ばす方法があるので、ちゃんと読み飛ばす
の2つをしっかり行えば、初心者でもちゃんと使える関数です。と言うか、変換の便利さ、書式の豊富さから言えば「超初心者向けの関数」です。
「scanfを使わずに、色々とゴチャゴチャ小細工する」って方が、よっぽど「上級者にしか出来ない高等テクニック」です。
の「5-4.scanf()の注意事項」を読みましょう。
>scanfは一度しか実行されずループし続けます
いいえ。scanfは実行されています。
「2度目以降のscanfを呼んだ時、入力バッファに変な物(%dとして受け付けない物)があると、scanfは入力バッファをそのままにして、何もしないで戻ってくる」ので「まるでscanfが実行されていないように見える」だけです。
scanfは「変換できた個数を返す」と言う仕様になっているので
while (1) {
int key;
if (feof(stdin)) break; //EOFの時は終了
if (scanf("%d", &key) != 1) { //予期しない入力なら
scanf("%*[^\n]%*c"); //改行も含めて読み飛ばす
} else { //変換できたなら
if (key == 1) break; //1なら終了
}
}
など、scanfの戻り値を確認すると良いでしょう。
よく「scanfは、初心者が絶対に使ってはいけない関数」などと暴言を吐く人が居ますが、そんな事はありません。
・scanfの戻り値をちゃんと確認すれば予期せぬ入力の判定は可能
・予期せぬ入力を読み飛ばす方法があるので、ちゃんと読み飛ばす
の2つをしっかり行えば、初心者でもちゃんと使える関数です。と言うか、変換の便利さ、書式の豊富さから言えば「超初心者向けの関数」です。
「scanfを使わずに、色々とゴチャゴチャ小細工する」って方が、よっぽど「上級者にしか出来ない高等テクニック」です。
No.3
- 回答日時:
scanfは、初心者が絶対に使ってはいけない関数です。
(中上級者も使い道無いですけど)(1) fgetsとsscanfを組み合わせて使う
(2) sscanfの戻り値を確認する
char line[1000];
while(1){
int key;
if(!fgets(line,sizeof line,stdin)) break;
if(sscanf(line,"%d",&key)==1 && key==1) break;
}
もし、例題にscanf関数が出てくる入門書をお使いなら、別の本を探しましょう。
No.2
- 回答日時:
このやり方だと、scanfは整数値として解釈できる入力がないと、何度でも再試行してしまいます。
期待した入力が得られなかった場合、行末まで読み飛ばす処理を入れるべきです。
なお、stdinのような入力ストリームに対してfflushを呼び出すと未定義の動作になりますので、やってはいけません。
参考URL:http://www.kijineko.co.jp/tech/superstitions/ffl …
No.1
- 回答日時:
次の1行をscanfの次の行に追加したらいけるんじゃ?
fflush(stdin);
標準入力(stdin)のバッファを吐き出せということです。
入力というのはすぐにプログラムに渡されるわけではなく一定量が溜まってから渡されます。
これを一定量たまるまで待つのではなくすぐに渡せというのが上の意味です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コンソールアプリの入力時に改...
-
UWSCで変数をキー入力
-
コマンドプロンプトからのEOFの...
-
コンボボックスで日本語入力を...
-
漢字のソートについて
-
WindowsでEOF
-
数字以外が入力されたらエラー...
-
最早開始時間と最遅完了時刻を...
-
C言語 エラーの原因がわからな...
-
信頼区間の1.96や1.65ってどこ...
-
「Aに対するBの割合」と「Aに対...
-
For文の終了値を関数にしても問...
-
配列をnビットシフトする
-
数学 一次関数 関数 y=-3/4x+k(...
-
std::set<int> で、ある値が何...
-
Enterキーを押されたら次の処理...
-
sscanfとscanfの違いがよくわか...
-
main.c:7:43: warning: implici...
-
#define _CRT_SECURE_NO_WARNIN...
-
InvokeMemberメソッドとは何を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
数字以外が入力されたらエラー...
-
正負を反転させて出力するプロ...
-
プログラミング初心者です。 Py...
-
*をユーザーが入力した数字の数...
-
java初心者です。入力されたの...
-
コマンドプロンプトからのEOFの...
-
4桁の数字以外を入力したらエラ...
-
Eclipseコンソール表示を、リセ...
-
Excel VBAで、Application.Inpu...
-
"scanf"でエンターで改行させな...
-
cout関数を使っているのですが...
-
プログラミングの問題です 「金...
-
scanf関数について
-
Userformの入力順序をタブオー...
-
C言語でgetchar();が上手く使え...
-
プログラムの実行時に'<'でリダ...
-
C言語初心者です。ファイルの読...
-
scanf が無視されます
-
実行結果の順番がおかしいんで...
-
C言語scanf_sで何故か2回入力に...
おすすめ情報