- 締切済み
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で処理が終了します。
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- samtomsan
- ベストアンサー率55% (1060/1897)
Windows環境でMinGWを使っておられると思いますが > ^Zと^Dの値は、ともに0xaです Windowsに依存しているようですね。 MinGWを使っていないので判りませんが、getchやscanfでも同じでしょうか。 他のキー入力関数も調べて見たらいかがでしょうか。
- samtomsan
- ベストアンサー率55% (1060/1897)
> ch = getchar()で半角の1は0x31、半角aは0x61、EOFは0xffffffffです EOFは-1ということですね。 ^Zと^Dの値は表示されますか。 表示されたならその16進数をEOFの代わりに使って見たらいかがでしょうか。
お礼
引き続き、ご回答ありがとうございます。
補足
> ^Zと^Dの値は表示されますか。 ^Zと^Dの値は、ともに0xaです。 0xaは改行ですよね。そうすると^Zと^Dの値は何も受け取っていないことになりますよね。どうもこの辺りが問題のような気がしてきました。
- samtomsan
- ベストアンサー率55% (1060/1897)
既に ANo.3さんが回答していますが、このような場合は getchar() で実際に何が受け取られているか確認される方がよいかと思います。(whileを使わないで) ch = getchar(); printf(%x\n,ch); かな。 ついでに EOF も調べておいた方がよいかも。 printf(%x\n,EOF);
お礼
ご回答ありがとうございます。
補足
早速while()を使わないで、値を調べてみました。ch = getchar()で半角の1は0x31、半角aは0x61、EOFは0xffffffffです。
- Tacosan
- ベストアンサー率23% (3656/15482)
stty って使える?
お礼
ご回答ありがとうございます。
補足
minttyのコマンドラインで「stty -a」で設定を見てみましたが、「eof = ^D; eol = <undef>;」などとなっています。これを仮にeof = ^Zに変更したりすると(変更の仕方はまだ分かりませんが)viエディタ(まだインストールしていません)などを使う時に不都合などが生じないかとふと思いましたが、どうでしょうか。
- koujikuu
- ベストアンサー率43% (429/993)
同じような質問がありました、参照して下さい。 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1052822865
お礼
続けてご回答ありがとうございます。
補足
参考になるデータを紹介いただきありがとうございます。ただこの質問されている方はDOS窓を使っているのか、統合開発環境を使っているか今ひとつ不明で、私のminttyの場合とちょっと違うニュアンスを感じました。
- koujikuu
- ベストアンサー率43% (429/993)
入力した文字を16進で表示して、何の文字が入力されているのか or 入力できないのか確認して下さい。
お礼
ご回答ありがとうございます。
補足
getchar()で受け取った数字や文字がputchar()で画面に表示されていません。またwhile文の中にprintf()を追加して受け取った文字や数字を16進で表示しようとしてもprintf()も画面に値を表示しませんでした。
- asuncion
- ベストアンサー率33% (2127/6289)
エミュレーターの仕様が、 Ctrl + Z ≠ EOF になっていたりしませんか?
お礼
ご回答ありがとうございます。
補足
このエミュレータが「Ctrl + Z ≠ EOF」なのかは、自分で調べた範囲では分かりませんでした。minttyの仕様に関する以下のサイトでもそれらしいことが書かれていませんでした。 http://gnupack.sourceforge.jp/docs/latest/UsersGuide_technical_info.html
お礼
引き続き、ご回答ありがとうございます。細かくチェックポイントを指示していただき、感謝します。
補足
getch()は、^Zと^Dの値はprintf()で表示されませんでした(永久ループのように終了しないので強制終了しました)。 scanf()は、^Zと^Dの値はともに0xaです。 他の入力関数も試そうと思ったのですが、 > Windowsに依存しているようですね。 ということが大きいようなので、少し頭を冷やして別の方法を自分でも考えてみます。