私はEclipseを使用してC/C++でコードを作成しており、非常に簡単なものに苦労しています。以下のコードでは、printf()
とscanf()
の後に使用しています。 Althougth printf
はscanf()
の前に書き込まれ、出力は異なります。同様の問題について何かを見つけることができました こちら 。しかし、私はそれを解決することができませんでした。何か案は?
コード:
#include <stdio.h>
int main()
{
int myvariable;
printf("Enter a number:");
scanf("%d", &myvariable);
printf("%d", myvariable);
return 0;
}
期待される出力:
Enter a number:1
1
代わりに私は得る:
1
Enter a number:1
出力はバッファリングされています。次の4つのオプションがあります。
明示的なフラッシュ
fflush
は、バッファから利益を得るための各書き込みの後に、望ましい動作/表示を明示的に強制します。
fflush( stdout );
バッファのみを行ごとにバッファする
完全な行のみを印刷するのに十分であることがわかっている場合に役立ちます
setlinebuf(stdout);
バッファを無効にします
setbuf(stdout, NULL);
コンソールが提供するオプションメニューを使用して、コンソールのバッファリングを無効にします。
オプション1のコードは次のとおりです。
#include <stdio.h>
int main() {
int myvariable;
printf("Enter a number:");
fflush( stdout );
scanf("%d", &myvariable);
printf("%d", myvariable);
fflush( stdout );
return 0;
}
ここに2があります:
#include <stdio.h>
int main() {
int myvariable;
setlinebuf(stdout);
printf("Enter a number:");
scanf("%d", &myvariable);
printf("%d", myvariable);
return 0;
}
および3:
#include <stdio.h>
int main() {
int myvariable;
setbuf(stdout, NULL);
printf("Enter a number:");
scanf("%d", &myvariable);
printf("%d", myvariable);
return 0;
}
さて、最後に、@ zsawyerが3というラベルの付いたオプションとして書いたものに似たものを使用しました。私のコードでは、次の行を挿入しました。
setvbuf(stdout, NULL, _IONBF, 0);
Main()の最初の行として:
#include <stdio.h>
int main()
{
setvbuf(stdout, NULL, _IONBF, 0);
int myvariable;
printf("Enter a number:");
scanf("%d", &myvariable);
printf("%d", myvariable);
return 0;
}
here から取得しました。
迅速かつ簡単に、私はただ"eprint"という名前のマクロを定義しましたprintf(...)を呼び出した後にflush()を追加しましたそして、私は以下のeprintマクロを使用します。
#define eprintf(...) printf(__VA_ARGS__); \
fflush(stdout); \
#include <stdio.h>
#include <stdlib.h>
#define eprintf(...) printf(__VA_ARGS__); \
fflush(stdout); \
int main(void) {
int a;
eprintf("a=");
scanf("%d",&a);
eprintf("I've read value %d.\n",a);
return EXIT_SUCCESS;
}
a=5
I've read value 5.
PS:このEclipseコンソールの問題と考えられる修正を調べるのに30分を無駄にしました。これは、このようなものを探している人にとって最も簡単で理解しやすいようです。