1

私は、C で書かれた非常に基本的なプログラムをテストしていました。その全体を以下に示します。TCC によって生成された実行可能ファイルを実行しようとすると、printf() 呼び出しからの出力を実際に表示する前に、連続する fgets() ごとに入力を入力する必要があることに気付きました。

これは非常に紛らわしいので、標準の Windows コンソールで実行可能ファイルを実行してみることにしました。問題なく実行され、入力プロンプトと出力プロンプトが適切な順序で表示されました。

しかし、GCC でプログラムをコンパイルすると、Cygwin でコンパイルされた端末で正常に動作することに気付きました (mintty、rxvt でも同じ結果が得られました)。

なぜこれが起こっているのか、どうすればそれを止めることができるのか、誰か説明してもらえますか? Cygwin ベースの端末を使用しながら、Cygwin とは独立してプログラムをコンパイルしたいと考えています。

ありがとう!

int main()
{
        char something[12];

        printf("This printf() should be outputted before you are prompted for input: ");

        fgets(something, sizeof something, stdin);

        printf("You entered, %s", something);
}
4

3 に答える 3

2

これは、標準入力と標準出力のバッファリングによるものです。C標準がこれについて何を言わなければならないかはわかりません(C++では、ストリームはデフォルトで結合されています)が、標準出力を自分でフラッシュできます:

 fflush( stdout );

printf の呼び出し後。

于 2011-04-23T08:03:33.523 に答える
1

標準出力ストリームは通常行バッファリングされます。つまり、改行を出力するとバッファがフラッシュされます。

次のように明示的にフラッシュできます。

fflush(stdout);

また、特定のストリームのバッファリングをオフにするには、次のようにしますs

setvbuf(s, NULL, _IONBF, 0);

詳細については、setvbuf() のマンページを参照してください。

于 2011-04-23T08:38:17.073 に答える
1

Mintty と rxvt は、Unix疑似端末デバイスに基づく端末エミュレーターです。Cygwin は、 Windows パイプに基づいてこれらを実装します。

プログラムを Cygwin gcc でコンパイルすると、Cygwin DLL にリンクされます。Cygwin DLL には、端末に接続されたストリームを Unix システムで正常に動作させるための魔法がすべて含まれています。これは、デフォルトでライン バッファリングを意味します。

ただし、tcc を使用してプログラムをコンパイルすると、ネイティブ Windows プログラムが作成され、それは基礎となる Windows パイプのみを認識します。Microsoft C ライブラリでは、パイプに接続されたストリームはデフォルトで完全にバッファリングされfflush(stdout)ますsetvbuf(stdout, NULL, _IONBF, 0)。MS の C ライブラリは行バッファリングをサポートしていません。

于 2011-04-23T10:50:19.147 に答える