簡単な質問で恐縮ですが、現在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;
}
No.11
- 回答日時:
>その辺を制御したいならOS依存になるはずですがWindowsだとどうするんだろ。
そこまで行くとWindowsAPIでしょうか……。
http://msdn.microsoft.com/ja-jp/library/cc429744 …
なんての見つけましたけど……。
GetStdHandle()でハンドルを取得、GetConsoleMode()で現在のモードを取得して、
ENABLE_LINE_INPUTのフラグを落としてSetConsoleMode()で設定…でしょうか……。
APIで変更した内容がCランタイムライブラリの方に影響を与えるかどうか?に関しては疑問ですが。
# ランタイムの方の行バッファも無効にする必要がありますかねぇ…。
って、置いてけぼりとか言いつつ続けてしまう私。
# さすがに試してまではいない。
# コンソール上で動作するゲームでも作らないと行バッファとか問題にならない…でしょうし。
No.12
- 回答日時:
#7へのお礼の中の疑問
> もう一度「^Z」「Enter」を押さねば「E:13」という出力が現れません。
OSの仕様か、Visual Studioの仕様かわかりませんが、Ctrl+Zが入力行の先頭にないとEOF(値は-1)は返ってきません。行の途中に入れると値0x1aが返ってきます。また、Ctrl+Zに続けて文字を入力させようとしても、その行のCtrl+Zより後の文字は改行文字を含めて破棄されてしまいます。
No.13
- 回答日時:
>ところで、ご示し頂いたコードをそのまま試してみたのですが、
>不思議なことに、
>(略)
>となり、もう一度「^Z」「Enter」を押さねば「E:13」という出力が現れません。
>これは一体どういうことなんでしょうか??
「^Z」の扱いについては、一部「環境依存」の部分があって、他の回答にある通り
「行頭での^ZのみEOFが返り、行頭ではない^Zは\x1aが返る」
と言う処理系と
「行頭でも、行頭以外でも^Zが現れた時点でEOFが返る」
と言う処理系があります。
なので、Visual Studioのデバッグ画面で試さず、リリース版exeを作ってからコマンドプロンプトで実行して試すと、結果が変わる可能性があります。
因みに、当方が試した環境は、後者の「^Zが現れた時点でEOFが返る」のタイプでした。
なるほど~。色々と環境の影響があるんですね。。
こういうことってなかなか入門書なんかには書いてないので非常にありがたいです!
本にはこうなりますってものと同じもの書いてもならないと、本が間違ってるのか何のか分からなくなりますからね。
No.14
- 回答日時:
>こういうことってなかなか入門書なんかには書いてないので非常にありがたいです!
入門書レベルではそこまで深い(環境依存度の高い)ネタはやらないんでしょう。
# たとえば質問でも書かれているCtrl+DでEOFはUNIX系の場合(というかシェル?)依存ですし。
>本にはこうなりますってものと同じもの書いてもならないと、本が間違ってるのか何のか分からなくなりますからね。
著者が前提としている(あるいは動作確認した)環境が明示されていないモノは…避けた方がいいかもしれませんね。
たいていはOSやコンパイラ、バージョンなんかが明記されているかと。
最初の方に書かれているか、後ろの方の索引近くに書かれているかという違いはありますが。
# 入門書なり購入するときは明記されているか確認・納得の上で購入した方がよいでしょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# char string[100]; int c, i=0; while( (c=getchar()) 2 2022/05/30 21:41
- C言語・C++・C# C pointer? or... 2 2022/03/29 00:47
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
2進数の1の数を数える問題
-
Linuxで入力待ちなしkeyread関...
-
*をユーザーが入力した数字の数...
-
特定の文字が入力されるまで・・・
-
プログラムの進行が一時ストッ...
-
double型が正常に認識されてい...
-
gets_sがうまく動かない
-
プログラミングの問題です 「金...
-
"gets"は危険なのでしょうか?
-
BM法(ボイヤームーア法)に...
-
プログラミング初心者です。 Py...
-
C-Builderで数値(数字)以外を入...
-
scanfが2回使えない・・・?;
-
C言語について
-
WindowsでEOF
-
cout関数を使っているのですが...
-
C言語のプログラミングについて...
-
java初心者です。入力されたの...
-
UWSCで変数をキー入力
-
EXCEL VBA での、正規表現のパ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
数字以外が入力されたらエラー...
-
正負を反転させて出力するプロ...
-
プログラミング初心者です。 Py...
-
java初心者です。入力されたの...
-
Eclipseコンソール表示を、リセ...
-
scanfが2回使えない・・・?;
-
C言語 逆ピラミッドの作り方
-
double型が正常に認識されてい...
-
ワードで文字を入力する時の変...
-
コマンドプロンプトからのEOFの...
-
Linuxで入力待ちなしkeyread関...
-
scanf が無視されます
-
if文の条件にscanf関数を使うと…?
-
C言語について
-
cout関数を使っているのですが...
-
enterでループ終了
-
"scanf"でエンターで改行させな...
-
C言語でgetchar();が上手く使え...
-
C言語scanf_sで何故か2回入力に...
おすすめ情報