アプリ版:「スタンプのみでお礼する」機能のリリースについて

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で処理が終了します。

A 回答 (7件)

Windows環境でMinGWを使っておられると思いますが


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

この回答への補足

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

補足日時:2013/02/06 22:00
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/02/06 17:59

> ch = getchar()で半角の1は0x31、半角aは0x61、EOFは0xffffffffです


EOFは-1ということですね。
^Zと^Dの値は表示されますか。
表示されたならその16進数をEOFの代わりに使って見たらいかがでしょうか。

この回答への補足

> ^Zと^Dの値は表示されますか。
^Zと^Dの値は、ともに0xaです。

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

補足日時:2013/02/05 18:51
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/02/05 18:40

既に ANo.3さんが回答していますが、このような場合は getchar() で実際に何が受け取られているか確認される方がよいかと思います。

(whileを使わないで)
ch = getchar();
printf(%x\n,ch);
かな。
ついでに EOF も調べておいた方がよいかも。
printf(%x\n,EOF);

この回答への補足

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

補足日時:2013/02/05 18:16
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/02/05 18:03

stty って使える?

この回答への補足

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

補足日時:2013/02/05 17:58
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/02/05 17:49

同じような質問がありました、参照して下さい。



http://detail.chiebukuro.yahoo.co.jp/qa/question …

この回答への補足

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

補足日時:2013/02/05 17:48
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/02/05 17:39

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

この回答への補足

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

補足日時:2013/02/04 22:28
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/02/04 22:19

エミュレーターの仕様が、


Ctrl + Z ≠ EOF
になっていたりしませんか?

この回答への補足

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

補足日時:2013/02/04 22:18
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/02/04 22:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!