- ベストアンサー
getchar()をつける意味
Visual C++ 2005 Express Edition でC言語を習っている者です。 「getchar()はおまじないのようなものだから」と言う風にしか説明してくれず、付ける意味がわかりません。 なぜgetcharをつけるのでしょうか。 また、つけないと支障はありますか。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
「おまじない」とのことなので、scanfの後で改行を読み飛ばすような話ではない気がします(getcharを入れるだけでは確実ではないですし)。 多分、 #include <stdio.h> int main(void) { puts("Hello, World!"); getchar(); /* ← おまじない */ return 0; } こうしておかないと、IDEからプログラムを起動した場合、一瞬だけコンソールが現れてすぐに消えてしまうからとか、そういうことではないでしょうか? 実際にはこんな姑息な対応はするより、return 0;のところにブレークポイントでも貼っておく方がずっとましです。 いずれにせよ、質問者さんが補足してくれないことにはどうしようもありません。
その他の回答 (8)
- postal0x02
- ベストアンサー率42% (24/57)
たぶん scanf の 改行コード読み飛ばしな気がする。 これの説明は少し面倒くさい。 ウィンドウ消さない為なら一言で済むから説明されるはず? >Visual C++ 2005 Express Edition これで組んでる場合デバッグモードでビルドすれば、 何かキーを押すまでウィンドウが消えない(getch)みたいなことを やってくれるはず。 質問者は常にリリースモードで組んでいるのだろうか???
お礼
ご回答ありがとうございました。
- Tacosan
- ベストアンサー率23% (3656/15482)
私が想像した「状況」は 1. scanf の後の改行の読み飛ばし: #7 で指摘されているように本当はこれでは不十分で, while ((ch = getchar()) != '\n' && ch != EOF); のようなループを組むか scanf("%*[^\n]\n"); のような「呪文」で消すのが安全なはず... この scanf はあってるかな? 2. IDE で実行したときに「ウインドウを消さない」ようにするため main の最後に入れる: #7 の通り の 2通り. でも, 確かに言われてみると「改行の読み飛ばし」なら「おまじないのようなもの」ではなく, きちんと説明できるはずだなぁ. むしろ scanf の謎の書式文字列の方が説明しにくい.
お礼
ご回答ありがとうございました。
- chie65536
- ベストアンサー率41% (2512/6032)
「scanfの問題点」については、wikipediaが詳しい。 http://ja.wikipedia.org/wiki/Scanf ここにも「ストリーム中に残った改行を読み飛ばす」のにgetcharを使う例が載っている。
お礼
ご回答ありがとうございました。
- postal0x02
- ベストアンサー率42% (24/57)
これねぇ。 高校だと教わったけど専門学校では「おまじない」って言われたよw 知ってたけど「なんで」って聞いてみたら「こういうもんだ」ってさ。
お礼
ご回答ありがとうございました。
- Tacosan
- ベストアンサー率23% (3656/15482)
状況は 2通りくらい考えられるけどどっちだろ. しかし, こんな (悪い意味で) いい加減な説明がまかり通るとは....
お礼
ご回答ありがとうございました。
- jacta
- ベストアンサー率26% (845/3158)
どんな文脈で、どんな使い方をした場合の話でしょうか?
お礼
ご回答ありがとうございました。
- tatsu99
- ベストアンサー率52% (391/751)
試しに、とってみて、実行したらどうなりますか?
お礼
ご回答ありがとうございました。
- chie65536
- ベストアンサー率41% (2512/6032)
もしかして #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()をコメントにしてみれば、すぐに違いが判る。
お礼
ご回答ありがとうございました。
お礼
ご回答ありがとうございました。