web-dev-qa-db-ja.com

コンソールでprintfが印刷されない

私はC言語で始めています。 IDEとしてEclipse(juno)を使用し、CDTプラグインをインストールしています。また、mingw64(GCC Compiler)を解凍しました。動作するかどうかを確認するための非常に簡単なプログラムを作成しました。これは私のコードです:

#include <stdio.h>

int main()
{
    int age;
    printf("Hello, please enter your age:\n");
    scanf("%d", &age);
    printf("Your age is %d", age);
    return 0;
}

問題は、出力バッファが最初のprintfの文字列値で満たされているが、コンソールに出力されないことです。数値を入力する必要があり、その後、バッファーがすべてのデータをコンソールに流し込むため、コンソールは次のように表示されます。

1
Hello, please enter your age:
Your age is 1

予想されるものの代わりに:

Hello, please enter your age:
1
Your age is 1

さて、最初のprintfの後にfflush(stdout)を使用できることがわかりましたが、このソリューションはエレガントで、必要でさえないと思います。これを克服する方法についてのアイデアはありますか?

EDIT-私は大学でこれを学んでいるので、コースで学んだことは何も使えないので、できるようにしますonly use printfおよびscanf

NEW EDIT-これについての説明を見つけたと思う。先ほど言ったように、Eclipse内のコンソールビューに出力しています。奇妙なことは、Windowsのコマンドラインからプログラムをコンパイルして実行すると、必要な結果が得られることです。したがって、Eclipseは実際に出力をファイルに書き込み、コンソールウィンドウに表示していると思います。実行構成でEclipseに実際のコマンドラインウィンドウを強制的に開くにはどうすればよいですか?

34
Mr T.

どうやらこれはEclipseの既知のバグです。このバグは、WONT-FIXの解決により解決されました。なぜだか分かりません。ここにリンクがあります: Eclipse C Console Bug

20
Mr T.

出力はバッファリングされます。

stdoutはデフォルトで行バッファリングされます。つまり、 '\ n'はバッファをフラッシュすることになっています。なぜあなたの場合は起こっていないのですか?ダンノアプリケーション/環境に関する詳細情報が必要です。

ただし、setvbuf()を使用してバッファリングを制御できます。

setvbuf(stdout, NULL, _IOLBF, 0);

これにより、stdoutが強制的に行バッファされます。

setvbuf(stdout, NULL, _IONBF, 0);

これにより、stdoutは強制的にバッファリングされないため、fflush()を使用する必要はありません。大量の印刷がある場合、アプリケーションのパフォーマンスに深刻な影響を与えることに注意してください。

21
kliteyn

印刷する前にこれを設定してみてください。

setvbuf (stdout, NULL, _IONBF, 0);
7
user1500049

Stdoutではなく、stderrへの書き込みを試みることができます。

fprintf(stderr, "Hello, please enter your age\n");

this 関連するスレッドもご覧ください。

6
Kitchi

他の人が指摘したように、コンソールまたはシェルがそれを見る機会がある前に、プログラム内で出力をバッファリングできます。

Macを含むUnixライクなシステムでは、stdoutにはデフォルトで行ベースのバッファリングがあります。これは、プログラムが改行を見るとすぐにstdoutバッファを空にすることを意味します。

ただし、Windowsでは、改行は特別ではなくなり、完全なバッファリングが使用されます。 Windowsは行バッファリングをまったくサポートしていません。 setvbufのmsdnページ を参照してください。

そのため、Windowsでは、次のようにstdoutバッファリングを完全に停止することをお勧めします。

setvbuf (stdout, NULL, _IONBF, 0);
4
Tyler
  1. プロジェクトフォルダで、「。gdbinit」テキストファイルを作成します。 gdbデバッガー構成が含まれます
  2. 「.gdbinit」を編集し、行を追加します(引用符なし):「set new-console on」
  3. プロジェクトをビルドした後、以下に示すように、プロジェクトデバッグ>「デバッグ構成」を右クリックします。 Debug configuration

  4. 「デバッガ」タブで、「GDBコマンドファイル」が「.gdbinit」ファイルを指していることを確認します。それ以外の場合は、「。gdbinit」構成ファイルへのパスを入力します。 Gdb configuration

  5. 「適用」および「デバッグ」をクリックします。以下に示すように、ネイティブDOSコマンドラインを起動する必要があります Console

1
babyinEclipse

c:\gygwin\binPATH環境変数にシステム環境変数として、またはEclipseプロジェクトで追加します(properties-> run/debug-> edit)

1
user2838962