
No.7ベストアンサー
- 回答日時:
「おまじない」とのことなので、scanfの後で改行を読み飛ばすような話ではない気がします(getcharを入れるだけでは確実ではないですし)。
多分、
#include <stdio.h>
int main(void)
{
puts("Hello, World!");
getchar(); /* ← おまじない */
return 0;
}
こうしておかないと、IDEからプログラムを起動した場合、一瞬だけコンソールが現れてすぐに消えてしまうからとか、そういうことではないでしょうか?
実際にはこんな姑息な対応はするより、return 0;のところにブレークポイントでも貼っておく方がずっとましです。
いずれにせよ、質問者さんが補足してくれないことにはどうしようもありません。
No.8
- 回答日時:
私が想像した「状況」は
1. scanf の後の改行の読み飛ばし: #7 で指摘されているように本当はこれでは不十分で,
while ((ch = getchar()) != '\n' && ch != EOF);
のようなループを組むか
scanf("%*[^\n]\n");
のような「呪文」で消すのが安全なはず... この scanf はあってるかな?
2. IDE で実行したときに「ウインドウを消さない」ようにするため main の最後に入れる: #7 の通り
の 2通り.
でも, 確かに言われてみると「改行の読み飛ばし」なら「おまじないのようなもの」ではなく, きちんと説明できるはずだなぁ. むしろ scanf の謎の書式文字列の方が説明しにくい.
No.6
- 回答日時:
「scanfの問題点」については、wikipediaが詳しい。
http://ja.wikipedia.org/wiki/Scanf
ここにも「ストリーム中に残った改行を読み飛ばす」のにgetcharを使う例が載っている。
No.5
- 回答日時:
これねぇ。
高校だと教わったけど専門学校では「おまじない」って言われたよw
知ってたけど「なんで」って聞いてみたら「こういうもんだ」ってさ。
No.1
- 回答日時:
もしかして
#include <stdio.h>
main()
{
int data1,data2;
char chr1;
printf("数値1=");
scanf("%d",&data1);
getchar(); /* おまじない */
printf("文字1=");
scanf("%c",&chr1);
getchar(); /* おまじない */
printf("数値2=");
scanf("%d",&data2);
getchar(); /* おまじない */
printf("%d,%c,%dが入力されました\n",data1,chr1,data2);
}
のように、scanf()の直後のgetchar()の事かな?
だとしたら、これは「改行の読み捨て」の為に付けている。
これを実行すると
数値1=12345↓ (↓は「Enterキー」)
文字1=a↓ (↓は「Enterキー」)
数値2=678↓ (↓は「Enterキー」)
12345,a,678が入力されました
のようになる。
数値入力を完了するには、Enterキーを押さないとならない。
キーから「12345↓」と入力すると、標準入力のバッファには
'1' '2' '3' '4' '5' '\n'
と、改行コードも含めてバッファリングされる。
最初のscanfでは、何も入力していないので、キーボードからの入力待ちになり「12345+Enter」を入力すると
'1' '2' '3' '4' '5'
まで読み込み、'\n'が現れた段階で、'\n'をバッファに残した状態で終了する。
次のgetchar()は、残った
'\n'
を読み、それを捨てて終る。
次のscanfは、バッファが空の状態から始まるので、キーボードからの入力待ちになり「a+Enter」を入力すると
'a'
を読み込む。次のgetchar()は、残った
'\n'
を読み、それを捨てて終る。
3回目のscanfも、バッファが空の状態から始まるので、キーボードからの入力待ちになり「678+Enter」を入力すると
'6' '7' '8'
まで読み込み、'\n'が現れた段階で、'\n'をバッファに残した状態で終了する。
次のgetchar()は、残った
'\n'
を読み、それを捨てて終る。
もし、getchar()が無かったら、どうなるかと言うと
数値1=12345↓ (↓は「Enterキー」)
文字1=数値2=678↓ (↓は「Enterキー」)
12345,
,678が入力されました
と言うように「文字1=」の入力が行われずに(と言うか、文字1の入力時に、バッファに残ってた改行文字が入力されてしまい)次に進んでしまう。
「おまじない」と書かれた行のgetchar()をコメントにしてみれば、すぐに違いが判る。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# char string[100]; int c, i=0; while( (c=getchar()) 2 2022/05/30 21:41
- 哲学 日本語は論理表現にふさわしくないか の問題です 4 2022/06/25 03:56
- 日本語 意味とは何か? どこにあるのか?(Ⅱ) 4 2022/04/21 13:35
- TOEFL・TOEIC・英語検定 account は本当に自動詞なんですか? 3 2022/05/16 10:54
- 哲学 日本語は 言語類型として あたかも始原のごとくである 3 2022/05/29 04:41
- 哲学 ソシュール≒丸山圭三郎の《言語記号の恣意性》説はウソである 6 2022/12/01 06:19
- その他(言語学・言語) 外国語問題 1 2022/07/21 15:21
- 日本語 意味とは何か、どこにあるのか? 16 2022/04/09 11:44
- 数学 判断推理です。 A〜Eの5人が自分たちの年齢について次の発言をしたが、1人だけがウソをついている。こ 1 2022/04/20 19:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
正負を反転させて出力するプロ...
-
プログラミングの問題です 「金...
-
UWSCで変数をキー入力
-
C言語でのカレンダー作成
-
数字以外が入力されたらエラー...
-
ゲームダンジョンの武器の装備...
-
*をユーザーが入力した数字の数...
-
C言語の標準関数についての質問...
-
scanfが2回使えない・・・?;
-
Eclipseコンソール表示を、リセ...
-
MinGWのC言語でCTRL+Zで処理が...
-
Linuxで入力待ちなしkeyread関...
-
ワードで文字を入力する時の変...
-
キーボード入力の終了につきま...
-
EDITコントロールで入力できる...
-
タイプイン
-
C言語でgetchar();が上手く使え...
-
Eclipseでコマンドラインを入力...
-
BM法(ボイヤームーア法)に...
-
Userformの入力順序をタブオー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
数字以外が入力されたらエラー...
-
*をユーザーが入力した数字の数...
-
java初心者です。入力されたの...
-
正負を反転させて出力するプロ...
-
Eclipseコンソール表示を、リセ...
-
scanfが2回使えない・・・?;
-
プログラミング初心者です。 Py...
-
C言語でgetchar();が上手く使え...
-
Excel VBAで、Application.Inpu...
-
電卓の小数点
-
cout関数を使っているのですが...
-
"scanf"でエンターで改行させな...
-
小数か整数かを判定する方法
-
至急教えてください!プログラ...
-
getchar()について 教えてくだ...
-
scanf が無視されます
-
batプログラム上で文字列を入力...
-
コマンドプロンプトからのEOFの...
-
IF文で戻ることはできますか?...
-
プログラミングの問題です 「金...
おすすめ情報