
getcharをしながらwhile文で出力すると一つ多く出力されるのです・・・。
変な現象に遭遇しました。1文字入力して「入力した文字は~です。」とxが入力されるまで繰り返してくださいというプログラムを書きました↓
#include <stdio.h>
main()
{
char a;
do {
a = getchar();
printf("入力した文字は%cです。",a);
}
while(a != 'x');
}
ところが実行して、たとえばキーボードのaを押してenterキーを押すと
入力した文字はaです。入力した文字は
です。
と表示されるのです!!「入力した文字はaです。」だけでいいのに1つ多く出力されます。このソースは間違ってますか?
すみません、教えてください(涙)
No.3ベストアンサー
- 回答日時:
getcharは入力した文字をそのまま返します。
> キーボードのaを押してenterキーを押すと
aの後でenterキーを押しているのだから、enterも入力されます。すなわち'\n'が入力されているので、printf文でも'\n'(改行)が出力されます。
getcharの入力の終りはscanf等のようなenterではなくて、ctrl+Zです。
ありがとうございます!!
enterというのも文字なのですね。\nが入力されているのですか。
それであの変な出力になったわけですね・・・。
それにしてもctrl+Zを押しても終わりません。なんででしょう(汗)
手軽に勉強できる「C machine」というソフトを使っています。
No.8
- 回答日時:
あれ? fflush って, 入力ストリームに使っていいんでしたっけ>#7. まあ「処理系依存」って書いてあるからいいといえばいいけど....
なお, #4 で指摘した「間違い」は「getchar の返り値を char で受けている」ところです. getchar の返り値は int で受けなければならない. 出てる警告はおそらく「int から char に変換している」というものだろうと思うけど, キャストで無理やりつぶすのは本筋ではないです. この辺は getchar の説明を頑張って探せば出てくるはず.
たくさんありがとうございます!!
getcharを調べたらすぐに戻り値はint型とありました。なんで私が読んでいた本ではchar型にしていたのだろう。変な本ですね・・・。
No.7
- 回答日時:
(処理系依存の「回答」ですが・・)
#2, #3 さんの言われる 「enter」 を「飛ばして◆」しまえばいいのでは、・・。
http://www.bohyoh.com/CandCPP/C/Library/fflush.h …
http://www9.plala.or.jp/sgwr-t/lib/fflush.html
int a;
do{
a = getchar();
printf( "入力した文字は%cです。\n", a );
fflush( stdin ); // ◆
}while( a != 'x' );
ありがとうございます!!
fflush(stdin);
を追加したら
入力した文字は
です。
という変なのがなくなりました!! それにしても難しい関数ですね・・・。リンク先の説明が難しかったです。
おかげさまで解決した感があるのですが、
No.4のTacosanさんの「このプログラムには誤りがある」という指摘の謎が解けなくて不完全燃焼です(^^;
No.6
- 回答日時:
>visual C++ Express editionでビルドしてみましたが警告はでませんでした。
VC++ 2010 ExpressEditionで確認。
ワーニングレベルを引き上げないと出ないようです…。
# /W3から/W4へ引き上げ。
>Ctrl+Zと押すと^Zと出ました。もしかしたら、この二つの文字になったら
'^Z'ではないので念のため。
こんにちは。また回答していただいてありがとうございます!!
私のは2008の方ですが、ワーニングレベルを/W4に引き上げたら警告が二つでました。それを修正して警告が出ないようにしたのですが、プログラムの動作は変わりません・・・。何が間違っているのでしょう(>_<)
'^Z'はCtrl+Zを示す文字ではないのですね。危ない危ない(汗)
#include <stdio.h>
int main() /* 訂正1 main関数の戻り値を指定した */
{
char a;
do {
a = (char)getchar(); /* 訂正2 char型のキャスト演算子を使用してaに入る型を揃えた */
printf("入力した文字は%cです。",a);
}
while(a != 'x');
}
No.5
- 回答日時:
>while(a != 'x' || a = 'Ctrl + z')
おそらくコンパイルエラーになるでしょう。
'Ctrl + z'は文字ではありません。
Ctrlキーは文字に割り当てられているワケではありませんから、単体で押したところでgetchar()では検出できません。
# 環境によってはCtrl+ZでなくCtrl+Dということもあったりしますが…。
Tacosanさんの書かれている間違いについては…
最近のまともなコンパイラなら警告出しているかと思われます。
ちなみに「C machine」とやらを試す気はありません。
ありがとうございます・・・。
Ctrlキーは文字ではないのですね。getchar()で検出する部分ではないのですか。
Tacosanのおっしゃっていたものが警告として出るかvisual C++ Express editionでビルドしてみましたが警告はでませんでした。
実行してみたら、Ctrl+Zと押すと^Zと出ました。もしかしたら、この二つの文字になったらループを抜けろってすればいいのでしょうか・・・。
No.4
- 回答日時:
このプログラムには間違いがあります. さて, どこでしょうか?
それはおいても, 「Ctrl+Z を押したら終わり」ってプログラムに書いてないにもかかわらず「Ctrl+Z を押したら終わり」って動作になったら, そっちの方が奇妙ですね.
教えに入っていただきありがとうございます!!
Ctrl+Zを押したらループから出るというのは確かに書いてないですね(^_^;
文字コード表を見て探したけどなぜかCtrlがありません。というか、Ctrlを押すとはどういうことなんだろう。文字コードにないのに・・・。
whileループを抜ける条件を二つ以上作れるのだろうか。
while(a != 'x' || a = 'Ctrl + z')
ものすごくおかしいし、二つのボタンを同時に押したらってどうやってプログラムで書くのでしょう。ううう、難しい。一回目がCtrlで二回目がzだったらという条件にするとか?
(*_*)
No.2
- 回答日時:
「aを押してenter」によって、「a」と「enter」の2文字が入力されているのです。
「enter」に対するgetcharで、変数aに'\n'が入り、それを表示すると改行されるため、
---
入力した文字は
です。
---
という結果になるのです。
ご回答ありがとうございます!!
入力した文字は
です。
というわけの分からなかった出力が理解できました。
でも、意図したとおりに動いてくれません。どう書き換えればよいのでしょう・・・。
入力した文字はaです。
入力した文字はbです。
入力した文字はxです。
プログラムが終わる、みたいになってほしいのですが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- Java Java 南京錠 2 2023/02/04 11:46
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Word(ワード) Windows11キーボードの調子が悪いので治し方を教えてください。 【症状】 1つ目 キーボードの 5 2022/07/03 14:51
- Excel(エクセル) セルに入力した小文字アルファベット、数字を大文字表示させるには? 3 2022/07/13 10:01
- Java Javaの問題なのですが、「3文字以上の英数字文字列を入力し、文字列の中に文字(9)が出てくるまでの 1 2023/06/06 18:55
- Android(アンドロイド) Android携帯のキーボード入力で時間入力を簡単にしたい 1 2023/05/17 02:13
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Eclipseコンソール表示を、リセ...
-
数字以外が入力されたらエラー...
-
java初心者です。入力されたの...
-
scanfが2回使えない・・・?;
-
C言語・YesNo入力のループで解...
-
正負を反転させて出力するプロ...
-
getchar()について 教えてくだ...
-
"scanf"でエンターで改行させな...
-
コマンドプロンプトからのEOFの...
-
至急教えてください!プログラ...
-
*をユーザーが入力した数字の数...
-
scanf関数 バッファに残ったエ...
-
入力候補を表示させるには・・・?
-
EDITコントロールで入力できる...
-
Excel VBAで、Application.Inpu...
-
入力値が1以下、かつ数字以外の...
-
WindowsでEOF
-
電卓の小数点
-
getcharをしながらwhile文で出...
-
ワードで文字を入力する時の変...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
正負を反転させて出力するプロ...
-
プログラミング初心者です。 Py...
-
数字以外が入力されたらエラー...
-
Excel VBAで、Application.Inpu...
-
EDITコントロールで入力できる...
-
*をユーザーが入力した数字の数...
-
Linuxプログラミングで、キーボ...
-
Eclipseコンソール表示を、リセ...
-
入力候補を表示させるには・・・?
-
batプログラム上で文字列を入力...
-
UWSCで変数をキー入力
-
VisualStudio2019のコードアナ...
-
小数か整数かを判定する方法
-
scanfが2回使えない・・・?;
-
Linuxで入力待ちなしkeyread関...
-
java初心者です。入力されたの...
-
Delphi初心者 ボタン操作につ...
-
コマンドプロンプトからのEOFの...
-
Eclipseでコマンドラインを入力...
-
Userformの入力順序をタブオー...
おすすめ情報