こんにちは。
あるプログラムを作っていると、次のような問題が起きてしまいました。
簡単なプログラムを例にして、説明したいと思います。
#include<stdio.h>
#include<conio.h>
#include<ctype.h>
void main(void)
{
char ch;
int i;
do{
ch=getch();
putchar(toupper(ch));
}while(ch!='q');
printf("\n");
scanf("%d",&i);
}
これはgetch()関数を使い入力された文字を大文字にして画面上に出力するものです。(qが入力されるまで)
その後に、意味はありませんが変数iに整数を入力して終了する。
ここで、問題になってくるのがこのプログラムを実行して、abcdefqと入力していくと、画面上にはABCDEFQと表示されます。そして、qが入力されたことでdo文が終了して改行が行われます。次にscanfによりいったん入力待ちになります。
この時、まだ、なにも入力していないにも関わらず、最後にgetchにより入力したqが表示されてしまいます。
qを消してscanfの入力をすればいいのですが、この問題を何とか解決したと思い質問しました。
scanfの後にgetchar()を使うときはscanf入力時の'\n'に注意が必要だということはわかるのですが、上に述べたような問題はこれに似ているのでしょうか?
参考書をみたり自分でもいろいろ試してみたのですがどうもうまくいきません。
どなたか、解決策を知っていたら是非教えて下さい。
できれば、getch()とscanfがどのように作用してこのようなことが起きてしまっているのか説明して頂けたら幸いです。
お手数ですが、みなさま、よろしくお願いいたします。
No.2
- 回答日時:
入力バッファーをクリアーするためなら、つぎの文をscanfの前に入れるとよいでしょう。
fflush(stdin);
または
rewind(stdin)
先頭に#include <stdio.h>があれば結構です。
以上。
ご回答有難う御座います。
scanfのあとにgetchar()関数を使う時には、入力バッファをクリアーする為に('\n'をクリアーする)rewind(stdin)やfflush(stdin)を使うのは分かります。
この場合はその方法用いても解決できませんでした。
すいません。なにか分かりましたら、また、宜しくお願い致します。
No.3
- 回答日時:
こんにちは。
itohhといいます。解決策としては、ほかの方がアドバイスしているので。
>できれば、getch()とscanfがどのように作用してこのようなことが
>起きてしまっているのか説明して頂けたら幸いです。
これは、「getch()とscanf」の関係で起こっているわけではありません。
do whileループでは、ループの最後で次のループを行うかを判定します。
そのため、getch関数で「q」が入力された後にputcharで出力され、その後、
ループの終了条件を判定します。
>do{
> ch=getch(); <-「q」を入力する。
> putchar(toupper(ch)); <-「Q」を出力する。
>}while(ch!='q'); <-ループ終了条件の判定。
回答者No.1の方の方法で行うのが、スマートな方法だと思いますよ。
ご回答有難う御座いました。
まず始めに、質問が悪くてすいません。
回答して頂いたことは、理解できます。もう一度説明しますと、
doループでは後判定なので、仮にabcqと入力すると、getch()では入力した文字が画面に出力されない為、画面にはABCQと表示されてscanfの入力待ちになります。ここで、画面にQ大文字のQが表示されてしまうのは構いません。しかし、この大文字のQ以外に小文字のqが表示されてしまうのです。
この小文字のqが表示されてしまうのが気になるのです。バックスペースでこのqを消してから希望の入力値を入れることはできるのですが、できればこのqを表示したくありません。何とかならないでしょうか?
あまりうまく説明できていないかもしれません。
お手数ですが、短いプログラムなので、試していただけると幸いです。どのようなことが起こってしまか分かっていただけると思います。
申し訳ありません。
また、アドバイスがありましたら、宜しくお願い致します。
No.4ベストアンサー
- 回答日時:
何か問題が正確に伝わっていなかったりするみたいですね(苦笑)
環境は Windows9X 系でしょうか。
この環境下では、getch と scanf を近いところで使うと問題が起きるんですよ。
OS が呼び出す ReadFile() が、getch() が拾ったはずのキーのキーアップイベントを、もう1度押されたと誤認するようです。
(NT系では正常に動作するそうです)
この問題は、scanf の代わりに cscanf を使うか、scanf を使う前に __flush_win95_keyup_events() を呼び出すことで回避できます。
1度試してみて下さい。
ご回答有難う御座います。
はい、環境はWindows98です。OSの問題があったのですね!!
勉強になりました。早速試してみたいと思います。
勉強中なもので、また、みかけたらご指導の程宜しくお願い致します。
また、回答してくださったみなさま、質問の際、環境について説明を書き落としてしまい申し訳ありませんでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
推しミネラルウォーターはありますか?
推しミネラルウォーターがあったら教えてください
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
C++ で、「)」が必要 というエラー
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミング初心者です。 Py...
-
正負を反転させて出力するプロ...
-
VB.NETで16進数+16進数や16進...
-
scanf が無視されます
-
C言語・標準入力でquitを入力で...
-
C言語でのカレンダー作成
-
3つほどプログラムをおしえてく...
-
特定の文字が入力されるまで・・・
-
入力フォームのテキストボック...
-
C言語の非標準コンソール関数ge...
-
日付型のデータに変換するには!?
-
getcharをしながらwhile文で出...
-
至急教えてください!プログラ...
-
フローチャートについて
-
"gets"は危険なのでしょうか?
-
入力候補を表示させるには・・・?
-
*をユーザーが入力した数字の数...
-
c言語の数当てゲームプログラム...
-
C言語 ループの問題
-
数字以外が入力されたらエラー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
正負を反転させて出力するプロ...
-
プログラミング初心者です。 Py...
-
数字以外が入力されたらエラー...
-
Eclipseコンソール表示を、リセ...
-
Excel VBAで、Application.Inpu...
-
*をユーザーが入力した数字の数...
-
java初心者です。入力されたの...
-
Linuxで入力待ちなしkeyread関...
-
batプログラム上で文字列を入力...
-
WindowsでEOF
-
Userformの入力順序をタブオー...
-
コマンドプロンプトからのEOFの...
-
EDITコントロールで入力できる...
-
VisualStudio2019のコードアナ...
-
電卓の小数点
-
Eclipseでコマンドラインを入力...
-
小数か整数かを判定する方法
-
cout関数を使っているのですが...
-
UWSCで変数をキー入力
-
ワードで文字を入力する時の変...
おすすめ情報