C / C++ printf () avant le problème scanf()

J'utilise Eclipse pour coder en C / C++ et je me bats avec ce qui pourrait être quelque chose d'assez facile. Dans mon code ci-dessous j'utilise printf() et après scanf(). Althougth {[5] } est écrit avant scanf() la sortie diffère. J'ai pu trouver quelque chose sur un problème similaire ici. Mais je n'étais pas en mesure de le résoudre. Des idées?

Code:

#include <stdio.h>

int main()
{
    int myvariable;

    printf("Enter a number:");
    scanf("%d", &myvariable);
    printf("%d", myvariable);

    return 0;
}

Résultats escomptés:

Enter a number:1
1

Au lieu de cela, je reçois:

1
Enter a number:1
21
demandé sur Mark Rotteveel 2013-06-02 01:08:23

2 réponses

Votre sortie est mise en mémoire tampon. Vous avez 4 options:

  1. Chasse explicite

    fflush après chaque écriture pour profiter du tampon et toujours appliquer explicitement le desiredbehavior/display.

    fflush( stdout );
    
  2. Avoir le tampon uniquement les lignes de tampon-Sage

    Utile lorsque vous savez qu'il suffit d'imprimer uniquement les lignes complètes

    setlinebuf(stdout);
    
  3. Désactiver le tampon

    setbuf(stdout, NULL);
    
  4. Désactiver la mise en mémoire tampon dans votre console via quoi toujours le menu options qu'il fournit


Exemples:

Voici votre code avec l'option 1:

#include <stdio.h>
int main() {

    int myvariable;

    printf("Enter a number:");
    fflush( stdout );
    scanf("%d", &myvariable);
    printf("%d", myvariable);
    fflush( stdout );

    return 0;
}

Voici 2:

#include <stdio.h>
int main() {

    int myvariable;

    setlinebuf(stdout);    

    printf("Enter a number:");
    scanf("%d", &myvariable);
    printf("%d", myvariable);

    return 0;
}

Et 3:

#include <stdio.h>
int main() {

    int myvariable;

    setbuf(stdout, NULL);     

    printf("Enter a number:");
    scanf("%d", &myvariable);
    printf("%d", myvariable);

    return 0;
}
24
répondu zsawyer 2013-06-01 22:00:05

Ok, donc finalement j'ai utilisé quelque chose de similaire à ce que @zsawyer a écrit comme une option étiquetée 3. Dans mon code, j'ai inséré cette ligne:

setvbuf(stdout, NULL, _IONBF, 0);

Comme première ligne dans 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;
}

Je l'ai eu de ici .

5
répondu quapka 2014-05-29 09:20:32