web-dev-qa-db-ja.com

scanf()の問題の前のC / C ++ printf()

私はEclipseを使用してC/C++でコードを作成しており、非常に簡単なものに苦労しています。以下のコードでは、printf()scanf()の後に使用しています。 Althougth printfscanf()の前に書き込まれ、出力は異なります。同様の問題について何かを見つけることができました こちら 。しかし、私はそれを解決することができませんでした。何か案は?

コード:

#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
27
quapka

出力はバッファリングされています。次の4つのオプションがあります。

  1. 明示的なフラッシュ

    fflushは、バッファから利益を得るための各書き込みの後に、望ましい動作/表示を明示的に強制します。

    fflush( stdout );
    
  2. バッファのみを行ごとにバッファする

    完全な行のみを印刷するのに十分であることがわかっている場合に役立ちます

    setlinebuf(stdout);
    
  3. バッファを無効にします

    setbuf(stdout, NULL);
    
  4. コンソールが提供するオプションメニューを使用して、コンソールのバッファリングを無効にします。


例:

オプション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;
}
34
zsawyer

さて、最後に、@ 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 から取得しました。

6
quapka

迅速かつ簡単に、私はただ"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;
}

Eclipseコンソール出力:

a=5
I've read value 5.

PS:このEclipseコンソールの問題と考えられる修正を調べるのに30分を無駄にしました。これは、このようなものを探している人にとって最も簡単で理解しやすいようです。

0
George