• 締切済み

MinGWのC言語でCTRL+Zで処理が終了しない

C言語をMinGWで学習していますが、以下のコードでCTRL+Zで処理が終了しません。お教え下さい。 #include <stdio.h> int main(void) { int ch; while ((ch = getchar()) != EOF) putchar(ch); return 0; } 端末エミュレータはminttyで、OSはWindws xp sp3です。ちなみにMinGW shellで実行するとCTRL+ZとEnterで処理が終了します。

みんなの回答

  • samtomsan
  • ベストアンサー率55% (1060/1897)
回答No.7

Windows環境でMinGWを使っておられると思いますが > ^Zと^Dの値は、ともに0xaです Windowsに依存しているようですね。 MinGWを使っていないので判りませんが、getchやscanfでも同じでしょうか。 他のキー入力関数も調べて見たらいかがでしょうか。

dqk10254
質問者

お礼

引き続き、ご回答ありがとうございます。細かくチェックポイントを指示していただき、感謝します。

dqk10254
質問者

補足

getch()は、^Zと^Dの値はprintf()で表示されませんでした(永久ループのように終了しないので強制終了しました)。 scanf()は、^Zと^Dの値はともに0xaです。 他の入力関数も試そうと思ったのですが、 > Windowsに依存しているようですね。 ということが大きいようなので、少し頭を冷やして別の方法を自分でも考えてみます。

  • samtomsan
  • ベストアンサー率55% (1060/1897)
回答No.6

> ch = getchar()で半角の1は0x31、半角aは0x61、EOFは0xffffffffです EOFは-1ということですね。 ^Zと^Dの値は表示されますか。 表示されたならその16進数をEOFの代わりに使って見たらいかがでしょうか。

dqk10254
質問者

お礼

引き続き、ご回答ありがとうございます。

dqk10254
質問者

補足

> ^Zと^Dの値は表示されますか。 ^Zと^Dの値は、ともに0xaです。 0xaは改行ですよね。そうすると^Zと^Dの値は何も受け取っていないことになりますよね。どうもこの辺りが問題のような気がしてきました。

  • samtomsan
  • ベストアンサー率55% (1060/1897)
回答No.5

既に ANo.3さんが回答していますが、このような場合は getchar() で実際に何が受け取られているか確認される方がよいかと思います。(whileを使わないで) ch = getchar(); printf(%x\n,ch); かな。 ついでに EOF も調べておいた方がよいかも。 printf(%x\n,EOF);

dqk10254
質問者

お礼

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

dqk10254
質問者

補足

早速while()を使わないで、値を調べてみました。ch = getchar()で半角の1は0x31、半角aは0x61、EOFは0xffffffffです。

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

stty って使える?

dqk10254
質問者

お礼

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

dqk10254
質問者

補足

minttyのコマンドラインで「stty -a」で設定を見てみましたが、「eof = ^D; eol = <undef>;」などとなっています。これを仮にeof = ^Zに変更したりすると(変更の仕方はまだ分かりませんが)viエディタ(まだインストールしていません)などを使う時に不都合などが生じないかとふと思いましたが、どうでしょうか。

  • koujikuu
  • ベストアンサー率43% (429/993)
回答No.3

同じような質問がありました、参照して下さい。 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1052822865

dqk10254
質問者

お礼

続けてご回答ありがとうございます。

dqk10254
質問者

補足

参考になるデータを紹介いただきありがとうございます。ただこの質問されている方はDOS窓を使っているのか、統合開発環境を使っているか今ひとつ不明で、私のminttyの場合とちょっと違うニュアンスを感じました。

  • koujikuu
  • ベストアンサー率43% (429/993)
回答No.2

入力した文字を16進で表示して、何の文字が入力されているのか or 入力できないのか確認して下さい。

dqk10254
質問者

お礼

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

dqk10254
質問者

補足

getchar()で受け取った数字や文字がputchar()で画面に表示されていません。またwhile文の中にprintf()を追加して受け取った文字や数字を16進で表示しようとしてもprintf()も画面に値を表示しませんでした。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

エミュレーターの仕様が、 Ctrl + Z ≠ EOF になっていたりしませんか?

dqk10254
質問者

お礼

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

dqk10254
質問者

補足

このエミュレータが「Ctrl + Z ≠ EOF」なのかは、自分で調べた範囲では分かりませんでした。minttyの仕様に関する以下のサイトでもそれらしいことが書かれていませんでした。 http://gnupack.sourceforge.jp/docs/latest/UsersGuide_technical_info.html

関連するQ&A