¿Simple C scanf no funciona? [duplicate]

4 minutos de lectura

avatar de usuario
John

Si intento algo como:

int anint;
char achar;

printf("\nEnter any integer:");
scanf("%d", &anint);
printf("\nEnter any character:");
scanf("%c", &achar);
printf("\nHello\n");
printf("\nThe integer entered is %d\n", anint);
printf("\nThe char entered is %c\n", achar);

Permite ingresar un número entero, luego salta el segundo scanf completamente, esto es realmente extraño, ya que cuando cambio los dos (el char scanf primero), funciona bien. ¿Qué diablos podría estar mal?

  • sus punteros tienen tamaños incorrectos, anint es un char y achar es un int. no hagas esto

    – Codificador de longitud variable

    19 de septiembre de 2010 a las 6:44


  • @Codificador de longitud variable: lo siento, estaba parafraseando un ejemplo más simple y lo mezclé con los dos. Ese error tipográfico no está relacionado con mi problema, solucionó el ejemplo.

    – John

    19 de septiembre de 2010 a las 6:44


avatar de usuario
coadicto

Al leer la entrada usando scanfla entrada se lee después de presionar la tecla de retorno, pero la nueva línea generada por la tecla de retorno no es consumida por scanflo que significa que la próxima vez que lea un char desde la entrada estándar habrá una nueva línea lista para ser leída.

Una forma de evitarlo es usar fgets para leer la entrada como una cadena y luego extraer lo que quieras usando sscanf como:

char line[MAX];

printf("\nEnter any integer:");
if( fgets(line,MAX,stdin) && sscanf(line,"%d", &anint)!=1 ) 
   anint=0;

printf("\nEnter any character:");
if( fgets(line,MAX,stdin) && sscanf(line,"%c", &achar)!=1 ) 
   achar=0;

Otra forma de consumir la nueva línea sería scanf("%c%*c",&anint);. Él %*c leerá la nueva línea del búfer y la descartará.

Es posible que desee leer esto:

C Preguntas frecuentes: ¿Por qué todos dicen que no se use scanf?

  • Necesitarías el %*c después de la %d formato (también, o en su lugar), ¿no? Aunque incluso eso no es confiable, si el usuario escribió un espacio o algo después del número y antes de la nueva línea. pienso fgets() + sscanf() es mejor.

    –Jonathan Leffler

    19 de septiembre de 2010 a las 6:47


  • @Jonathan: Tienes razón. Lo necesitaríamos después de la %d. Y si fgets + sscanf siempre es mejor

    – coadicto

    19 de septiembre de 2010 a las 6:52

  • @codeaddict: Lo siento por la aceptación prolongada, pero realmente me diste más información sobre cómo funcionan las partes internas en C. También aprecio mucho el enlace de preguntas frecuentes de C, tanto mejor para ser sabio y enseñarle estas cosas a la gente nueva, si es que alguna vez lo hago. llegar a ayudar a la gente más adelante.

    – John

    29 de septiembre de 2010 a las 1:49

  • /*Toma la entrada char usando scanf después de la entrada int usando scanf solo usa la función fflush(stdin) */ #include #include void main() { int x; char y; clrscr(); printf(“ingrese un int”); escaneo(“%d”,&x); fflush(entrada estándar); printf(“\n Ahora ingrese un caracter”); escaneo(“%c”,&y); printf(“\n X=%d y Y=%c”,x,y); obtener(); }

    – Rai Singh

    1 de diciembre de 2021 a las 13:20


Las otras respuestas son correctas – %c no salta los espacios en blanco. La forma más fácil de hacerlo es colocar un espacio en blanco antes del %c:

scanf(" %c", &achar);

(Cualquier espacio en blanco en la cadena de formato hará scanf consumir todos los espacios en blanco consecutivos).

  • ¿Cómo ayuda exactamente omitir el espacio en blanco a descartar la nueva línea? Por ejemplo: scanf("\n%c", &achar); funcionaria tambien

    – cpx

    15 de diciembre de 2012 a las 17:29


  • @cpx: porque una nueva línea es un espacio en blanco. Cualquier espacio en blanco en la cadena de formato se comporta como cualquier otro espacio en blanco, por lo que \n es tan bueno como un espacio (pero una letra más).

    – café

    15 de diciembre de 2012 a las 22:29


No se salta el segundo scanf(); el segundo scanf() lee la nueva línea dejada por la primera scanf(). La mayoría de los códigos de formato omiten los espacios en blanco; la %c El formato no salta los espacios en blanco.

avatar de usuario
Dale Díaz

vocación getchar() antes de scanf también purgará el salto de línea almacenado. Más ligero pero más situacional

char input_1;
char input_2;
getchar();
scanf("%c", &input_1);
getchar();
scanf("%c", &input_2);

eliminará los saltos de línea, más útil en líneas consecutivas de código donde sabe que es solo un valor en cola y no una cadena

Pruebe también _flushall() después de cada llamada a printf. . Básicamente, por defecto, el flujo de salida de los búferes C++ de MS, y el vaciado hace que el flujo de salida se vacíe.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad