Ctrl+'z'の挙動不審?

[戻る]
たいちう 2002/06/17(月) 17:41:57
K&Rの最初の方(p.22)で、下記のサンプルがありますよね。
入力した字数を数えるプログラム。

#include <stdio.h>
main(){
    long nc = 0;
    while (getchar() != EOF) 
        nc++;
    printf("%ld\n", nc);
}

私の環境 Win98 + VC6.0SP5 では、ncが表示されません。
(コンソールで拡張子はcppで作ってます。)
printf("\n%ld\n", nc); とすると、表示されます。

whileの終了のために、Ctrl+'z'を押しているのですが、
このとき、どっかでエラーが起こってしまってるのでしょうか?
入出力ストリームについて調べてみたのですが、
原因は分かりませんでした。

一体何が起きているのか教えていただけないでしょうか。

dairygoods 2002/06/18(火) 11:35:35
DOSプロンプトでは、Ctrl+Z[任意の入力]<Enter>
がEOFの入力であり、[任意の入力]の部分は捨てられます。
ところが、CのIOライブラリでは、Ctrl+Z のみでEOFと判定します。
そのため、その後の改行文字までのstdoutへの出力は、
DOSプロンプトが捨ててしまうようです。

たいちう 2002/06/18(火) 15:25:33
dairygoods様
回答ありがとうございます。
でも、まだよく分かりません。

stdinとstdoutは別のストリームだと思うのですが、
stdinで起きる「任意の文字」の切り捨てが
stdoutにも影響を与えるということから、
DOSプロンプトでは、Cのストリームとは別の、
入出力共用(少なくともある程度は)のストリームを
使っていると考えて良いのでしょうか?

乱文で申し訳ありません。
頭の中も乱れてます。

dairygoods 2002/06/18(火) 16:22:01
確かに、キー入力をstdinに流すのと、
stdoutへの出力を画面に表示するのは全然別の処理のような気がしますが、
きっとDOSプロンプト内で同じルーチンを通ってるんだろうな〜、
と想像するしかないですね(^^;

たいちう 2002/06/18(火) 17:51:10
[[解決]]
わかりました。
さように想像することにいたします。

解決チェックしておきます。
ありがとうございました。

kazuma 2002/06/19(水) 00:05:01
printf("%ld\n", nc);

の前にSleep(0);をはさむと表示されるという話をどこかで読んだ覚えがあります。

たいちう 2002/06/19(水) 08:32:18
kazuma様

表示されました。
DOSプロンプト内のルーチンがリセットされるものと
想像しておきます。

ありがとうございました。

古いスレッドには追加発言できません。