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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Visual Basic(VBA) ExcelVBAで、index、match関数を使用して、指定範囲に出力したい 3 2022/10/18 21:53
- Java Java 南京錠 2 2023/02/04 11:46
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
正負を反転させて出力するプロ...
-
プログラミング初心者です。 Py...
-
*をユーザーが入力した数字の数...
-
数字以外が入力されたらエラー...
-
VB.NETで16進数+16進数や16進...
-
vba
-
小数か整数かを判定する方法
-
scanf関数のループについて
-
C言語 逆ピラミッドの作り方
-
VB カウントダウンタイマーの作...
-
if文の条件にscanf関数を使うと…?
-
batプログラム上で文字列を入力...
-
漢字のソートについて
-
C++:cinが上手く使えない
-
cout関数を使っているのですが...
-
C言語(構造体)
-
getchar()について 教えてくだ...
-
Excel VBAで、Application.Inpu...
-
至急教えてください。プログラ...
-
C言語について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
正負を反転させて出力するプロ...
-
数字以外が入力されたらエラー...
-
プログラミング初心者です。 Py...
-
java初心者です。入力されたの...
-
プログラミングの問題です 「金...
-
Eclipseコンソール表示を、リセ...
-
C言語 逆ピラミッドの作り方
-
"scanf"でエンターで改行させな...
-
scanf が無視されます
-
if文の条件にscanf関数を使うと…?
-
C言語について
-
C言語scanf_sで何故か2回入力に...
-
Excel VBAで、Application.Inpu...
-
cout関数を使っているのですが...
-
double型が正常に認識されてい...
-
小数か整数かを判定する方法
-
WindowsでEOF
-
scanfが2回使えない・・・?;
-
C言語でgetchar();が上手く使え...
おすすめ情報