web-dev-qa-db-fra.com

C / C ++ printf () avant 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 printf est écrit avant scanf() la sortie diffère. J'ai pu découvrir quelque chose sur un problème similaire ici . Mais je n'ai pas pu 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;
}

Production attendue:

Enter a number:1
1

Au lieu de cela, je reçois:

1
Enter a number:1
27
quapka

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 comportement/affichage souhaité.

    fflush( stdout );
    
  2. avoir le tampon uniquement en termes de lignes de tampon

    utile lorsque vous savez qu'il suffit d'imprimer uniquement des 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 le menu d'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;
}

En 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;
}
34
zsawyer

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

setvbuf(stdout, NULL, _IONBF, 0);

En 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 obtenu de ici .

6
quapka

Rapide et indolore, j'ai juste défini une macro nommée "eprint" pour ajouter un flush () après avoir appelé printf (...) et j'utilise juste la macro eprint ci-dessous:

#define eprintf(...) printf(__VA_ARGS__); \
                 fflush(stdout);      \

Exemple de code ici:

#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;
}

Sortie console Eclipse:

a=5
I've read value 5.

PS: Je viens de perdre 30 minutes à rechercher ce problème de console Eclipse et les correctifs possibles, et celui-ci semble être le plus simple et le plus facile à comprendre pour quiconque recherche une telle chose.

0
George