• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:getcharをしながらwhile文で出力すると一つ多く出力されるので)

getcharを使ったwhile文での出力で一つ多く出力される現象について

このQ&Aのポイント
  • getcharを使用してwhile文で出力する際、一つ多く出力される現象が発生しています。
  • キーボードからの入力に対して「入力した文字は~です。」と表示するプログラムを作成しましたが、入力した文字が表示される前に余分な行が表示されてしまいます。
  • 原因を特定するためにソースコードを確認しましたが、間違いは見当たりません。この現象の原因と対策について教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

getcharは入力した文字をそのまま返します。 > キーボードのaを押してenterキーを押すと aの後でenterキーを押しているのだから、enterも入力されます。すなわち'\n'が入力されているので、printf文でも'\n'(改行)が出力されます。 getcharの入力の終りはscanf等のようなenterではなくて、ctrl+Zです。

rabitwo
質問者

お礼

ありがとうございます!! enterというのも文字なのですね。\nが入力されているのですか。 それであの変な出力になったわけですね・・・。 それにしてもctrl+Zを押しても終わりません。なんででしょう(汗) 手軽に勉強できる「C machine」というソフトを使っています。

その他の回答 (7)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.8

あれ? fflush って, 入力ストリームに使っていいんでしたっけ>#7. まあ「処理系依存」って書いてあるからいいといえばいいけど.... なお, #4 で指摘した「間違い」は「getchar の返り値を char で受けている」ところです. getchar の返り値は int で受けなければならない. 出てる警告はおそらく「int から char に変換している」というものだろうと思うけど, キャストで無理やりつぶすのは本筋ではないです. この辺は getchar の説明を頑張って探せば出てくるはず.

rabitwo
質問者

お礼

たくさんありがとうございます!! getcharを調べたらすぐに戻り値はint型とありました。なんで私が読んでいた本ではchar型にしていたのだろう。変な本ですね・・・。

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.7

(処理系依存の「回答」ですが・・) #2, #3 さんの言われる 「enter」 を「飛ばして◆」しまえばいいのでは、・・。 http://www.bohyoh.com/CandCPP/C/Library/fflush.html http://www9.plala.or.jp/sgwr-t/lib/fflush.html int a; do{ a = getchar(); printf( "入力した文字は%cです。\n", a ); fflush( stdin ); // ◆ }while( a != 'x' );

rabitwo
質問者

お礼

ありがとうございます!! fflush(stdin); を追加したら 入力した文字は です。 という変なのがなくなりました!! それにしても難しい関数ですね・・・。リンク先の説明が難しかったです。 おかげさまで解決した感があるのですが、 No.4のTacosanさんの「このプログラムには誤りがある」という指摘の謎が解けなくて不完全燃焼です(^^;

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.6

>visual C++ Express editionでビルドしてみましたが警告はでませんでした。 VC++ 2010 ExpressEditionで確認。 ワーニングレベルを引き上げないと出ないようです…。 # /W3から/W4へ引き上げ。 >Ctrl+Zと押すと^Zと出ました。もしかしたら、この二つの文字になったら '^Z'ではないので念のため。

rabitwo
質問者

お礼

こんにちは。また回答していただいてありがとうございます!! 私のは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'); }

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.5

>while(a != 'x' || a = 'Ctrl + z') おそらくコンパイルエラーになるでしょう。 'Ctrl + z'は文字ではありません。 Ctrlキーは文字に割り当てられているワケではありませんから、単体で押したところでgetchar()では検出できません。 # 環境によってはCtrl+ZでなくCtrl+Dということもあったりしますが…。 Tacosanさんの書かれている間違いについては… 最近のまともなコンパイラなら警告出しているかと思われます。 ちなみに「C machine」とやらを試す気はありません。

rabitwo
質問者

お礼

ありがとうございます・・・。 Ctrlキーは文字ではないのですね。getchar()で検出する部分ではないのですか。 Tacosanのおっしゃっていたものが警告として出るかvisual C++ Express editionでビルドしてみましたが警告はでませんでした。 実行してみたら、Ctrl+Zと押すと^Zと出ました。もしかしたら、この二つの文字になったらループを抜けろってすればいいのでしょうか・・・。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

このプログラムには間違いがあります. さて, どこでしょうか? それはおいても, 「Ctrl+Z を押したら終わり」ってプログラムに書いてないにもかかわらず「Ctrl+Z を押したら終わり」って動作になったら, そっちの方が奇妙ですね.

rabitwo
質問者

お礼

教えに入っていただきありがとうございます!! Ctrl+Zを押したらループから出るというのは確かに書いてないですね(^_^; 文字コード表を見て探したけどなぜかCtrlがありません。というか、Ctrlを押すとはどういうことなんだろう。文字コードにないのに・・・。 whileループを抜ける条件を二つ以上作れるのだろうか。 while(a != 'x' || a = 'Ctrl + z') ものすごくおかしいし、二つのボタンを同時に押したらってどうやってプログラムで書くのでしょう。ううう、難しい。一回目がCtrlで二回目がzだったらという条件にするとか? (*_*)

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.2

「aを押してenter」によって、「a」と「enter」の2文字が入力されているのです。 「enter」に対するgetcharで、変数aに'\n'が入り、それを表示すると改行されるため、 --- 入力した文字は です。 --- という結果になるのです。

rabitwo
質問者

お礼

ご回答ありがとうございます!! 入力した文字は です。 というわけの分からなかった出力が理解できました。 でも、意図したとおりに動いてくれません。どう書き換えればよいのでしょう・・・。 入力した文字はaです。 入力した文字はbです。 入力した文字はxです。 プログラムが終わる、みたいになってほしいのですが。

  • hanmemomo
  • ベストアンサー率35% (205/580)
回答No.1

エコー関数だからですよっ

rabitwo
質問者

補足

エコー関数? なんでしょう・・・。すみませんm(_ _)m