dポイントプレゼントキャンペーン実施中!

簡単な質問で恐縮ですが、現在WindowsでVC++2010Expressでコードを書いています。

そこで、以下の様な入力文字数を返すコードを書いているのですが、コマンドプロンプト上でCtrl+Z(Ctrl+Dも試した)を押してもストップしてくれません。(コマンドプロンプト上に「^Z(^D)」と表示されるだけです。

どなたか教えて頂けませんでしょうか?


#include <stdio.h>
int main()
{
int strText;
int counter=0;

while( (strText=getchar() ) != EOF){
++counter;
}
putchar(counter);

return 0;
}

A 回答 (14件中11~14件)

>その辺を制御したいならOS依存になるはずですがWindowsだとどうするんだろ。



そこまで行くとWindowsAPIでしょうか……。

http://msdn.microsoft.com/ja-jp/library/cc429744 …
なんての見つけましたけど……。

GetStdHandle()でハンドルを取得、GetConsoleMode()で現在のモードを取得して、
ENABLE_LINE_INPUTのフラグを落としてSetConsoleMode()で設定…でしょうか……。
APIで変更した内容がCランタイムライブラリの方に影響を与えるかどうか?に関しては疑問ですが。
# ランタイムの方の行バッファも無効にする必要がありますかねぇ…。


って、置いてけぼりとか言いつつ続けてしまう私。
# さすがに試してまではいない。
# コンソール上で動作するゲームでも作らないと行バッファとか問題にならない…でしょうし。

この回答への補足

途中から全然付いて行けてない質問主ですけど、どうぞお気になさらずプロの方同士で心ゆくまでディスカッションして下さい!

補足日時:2014/03/11 10:20
    • good
    • 0

#7へのお礼の中の疑問


> もう一度「^Z」「Enter」を押さねば「E:13」という出力が現れません。
OSの仕様か、Visual Studioの仕様かわかりませんが、Ctrl+Zが入力行の先頭にないとEOF(値は-1)は返ってきません。行の途中に入れると値0x1aが返ってきます。また、Ctrl+Zに続けて文字を入力させようとしても、その行のCtrl+Zより後の文字は改行文字を含めて破棄されてしまいます。
    • good
    • 0

>ところで、ご示し頂いたコードをそのまま試してみたのですが、


>不思議なことに、
>(略)
>となり、もう一度「^Z」「Enter」を押さねば「E:13」という出力が現れません。
>これは一体どういうことなんでしょうか??

「^Z」の扱いについては、一部「環境依存」の部分があって、他の回答にある通り

「行頭での^ZのみEOFが返り、行頭ではない^Zは\x1aが返る」

と言う処理系と

「行頭でも、行頭以外でも^Zが現れた時点でEOFが返る」

と言う処理系があります。

なので、Visual Studioのデバッグ画面で試さず、リリース版exeを作ってからコマンドプロンプトで実行して試すと、結果が変わる可能性があります。

因みに、当方が試した環境は、後者の「^Zが現れた時点でEOFが返る」のタイプでした。
    • good
    • 1
この回答へのお礼

なるほど~。色々と環境の影響があるんですね。。
こういうことってなかなか入門書なんかには書いてないので非常にありがたいです!
本にはこうなりますってものと同じもの書いてもならないと、本が間違ってるのか何のか分からなくなりますからね。

お礼日時:2014/03/11 11:41

>こういうことってなかなか入門書なんかには書いてないので非常にありがたいです!



入門書レベルではそこまで深い(環境依存度の高い)ネタはやらないんでしょう。
# たとえば質問でも書かれているCtrl+DでEOFはUNIX系の場合(というかシェル?)依存ですし。

>本にはこうなりますってものと同じもの書いてもならないと、本が間違ってるのか何のか分からなくなりますからね。

著者が前提としている(あるいは動作確認した)環境が明示されていないモノは…避けた方がいいかもしれませんね。
たいていはOSやコンパイラ、バージョンなんかが明記されているかと。
最初の方に書かれているか、後ろの方の索引近くに書かれているかという違いはありますが。
# 入門書なり購入するときは明記されているか確認・納得の上で購入した方がよいでしょう。
    • good
    • 0

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