重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

Visual C++ 2005 Express Edition
でC言語を習っている者です。

「getchar()はおまじないのようなものだから」と言う風にしか説明してくれず、付ける意味がわかりません。

なぜgetcharをつけるのでしょうか。
また、つけないと支障はありますか。

A 回答 (9件)

「おまじない」とのことなので、scanfの後で改行を読み飛ばすような話ではない気がします(getcharを入れるだけでは確実ではないですし)。


多分、

#include <stdio.h>
int main(void)
{
 puts("Hello, World!");
 getchar(); /* ← おまじない */
 return 0;
}

こうしておかないと、IDEからプログラムを起動した場合、一瞬だけコンソールが現れてすぐに消えてしまうからとか、そういうことではないでしょうか?
実際にはこんな姑息な対応はするより、return 0;のところにブレークポイントでも貼っておく方がずっとましです。

いずれにせよ、質問者さんが補足してくれないことにはどうしようもありません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

お礼日時:2008/11/05 18:14

たぶん scanf の 改行コード読み飛ばしな気がする。


これの説明は少し面倒くさい。

ウィンドウ消さない為なら一言で済むから説明されるはず?

>Visual C++ 2005 Express Edition
これで組んでる場合デバッグモードでビルドすれば、
何かキーを押すまでウィンドウが消えない(getch)みたいなことを
やってくれるはず。
質問者は常にリリースモードで組んでいるのだろうか???
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

お礼日時:2008/11/05 18:15

私が想像した「状況」は


1. scanf の後の改行の読み飛ばし: #7 で指摘されているように本当はこれでは不十分で,
while ((ch = getchar()) != '\n' && ch != EOF);
のようなループを組むか
scanf("%*[^\n]\n");
のような「呪文」で消すのが安全なはず... この scanf はあってるかな?
2. IDE で実行したときに「ウインドウを消さない」ようにするため main の最後に入れる: #7 の通り
の 2通り.
でも, 確かに言われてみると「改行の読み飛ばし」なら「おまじないのようなもの」ではなく, きちんと説明できるはずだなぁ. むしろ scanf の謎の書式文字列の方が説明しにくい.
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

お礼日時:2008/11/05 18:15

「scanfの問題点」については、wikipediaが詳しい。


http://ja.wikipedia.org/wiki/Scanf

ここにも「ストリーム中に残った改行を読み飛ばす」のにgetcharを使う例が載っている。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

お礼日時:2008/11/05 18:14

これねぇ。


高校だと教わったけど専門学校では「おまじない」って言われたよw
知ってたけど「なんで」って聞いてみたら「こういうもんだ」ってさ。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

お礼日時:2008/11/05 18:14

状況は 2通りくらい考えられるけどどっちだろ.


しかし, こんな (悪い意味で) いい加減な説明がまかり通るとは....
    • good
    • 1
この回答へのお礼

ご回答ありがとうございました。

お礼日時:2008/11/05 18:13

どんな文脈で、どんな使い方をした場合の話でしょうか?

    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

お礼日時:2008/11/05 18:13

試しに、とってみて、実行したらどうなりますか?

    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

お礼日時:2008/11/05 18:13

もしかして


#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()をコメントにしてみれば、すぐに違いが判る。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

お礼日時:2008/11/05 18:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!