C/C++ printf() antes del problema scanf()

Resuelto quapka asked hace 11 años • 2 respuestas

Estoy usando Eclipse para codificar en C/C++ y estoy luchando con lo que podría ser algo bastante fácil. En mi código a continuación uso printf()y después scanf(). Aunque printfse escribe antes, scanf()la salida difiere. Pude descubrir algo sobre un problema similar aquí . Pero no pude solucionarlo. ¿Algunas ideas?

Código:

#include <stdio.h>

int main()
{
    int myvariable;

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

    return 0;
}

Rendimiento esperado:

Enter a number:1
1

En lugar de eso obtengo:

1
Enter a number:1
quapka avatar Jun 02 '13 04:06 quapka
Aceptado

Su salida se está almacenando en buffer. Tienes 4 opciones:

  1. rubor explícito

    fflushdespués de cada escritura para aprovechar el búfer y seguir aplicando explícitamente el comportamiento/visualización deseado.

     fflush( stdout );
    
  2. tener el búfer solo en líneas de búfer

    útil para cuando sabes que es suficiente imprimir solo líneas completas

     setlinebuf(stdout);
    
  3. desactivar el buffer

     setbuf(stdout, NULL);
    
  4. deshabilite el almacenamiento en búfer en su consola a través del menú de opciones que proporciona


Ejemplos:

Aquí está su código con la opción 1:

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

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

    return 0;
}

Aquí hay 2:

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

    int myvariable;

    setlinebuf(stdout);    

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

    return 0;
}

y 3:

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

    int myvariable;

    setbuf(stdout, NULL);     

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

    return 0;
}
zsawyer avatar Jun 01 '2013 21:06 zsawyer

Ok, finalmente usé algo similar a lo que @zsawyer escribió como una opción etiquetada como 3. En mi código inserté esta línea:

setvbuf(stdout, NULL, _IONBF, 0);

Como primera línea en 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;
}

Lo saqué de aquí .

quapka avatar Jun 01 '2013 21:06 quapka