2010-09-19 20 views
19

si intento algo como:Simple C scanf no funciona?

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 entero, entonces se salta la segunda scanf por completo, esto es muy extraño, como cuando intercambiar los dos (el scanf char primero), que funciona bien . ¿Qué podría estar mal?

+1

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

+0

@Variable Length Coder: Lamento eso, fue parafraseando un ejemplo más simple y se mezcló con los dos. Ese error no está relacionado con mi problema, solucionó el problema. – John

Respuesta

22

Al leer entrada utilizando scanf, se lee la entrada después de pulsar la tecla de retorno, pero el salto de línea generada por la tecla de retorno no es consumido por scanf, lo que significa que la próxima vez que lea un char de la entrada estándar habrá una nueva línea lista para ser leída

Una forma de evitar es el uso de fgets para leer la entrada como una cadena y luego extraer lo que quiere usar como sscanf:

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);. El %*c leerá la nueva línea del buffer y la descartará.

Es posible que desee leer esto:

C FAQ : Why does everyone say not to use scanf?

+1

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

+3

@Jonathan: Tienes razón. Lo necesitaríamos después del '% d'. Y sí 'fgets + sscanf' siempre es mejor. – codaddict

+0

@codeaddict: Perdón por aceptarlo por mucho tiempo, pero realmente me dio más información sobre cómo funcionan las funciones internas en C. Realmente aprecio el vínculo de Preguntas frecuentes de C, lo mejor para ser sabio y enseñar cosas nuevas a las personas nuevas, si alguna vez llegue a ayudar a la gente más tarde. – John

5

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

12

Las otras respuestas son correctas - %c No salta los espacios en blanco. La manera más fácil de hacer que funcione es colocar espacios en blanco antes de la %c:

scanf(" %c", &achar); 

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

+0

¿Cómo ayuda saltar el espacio en blanco con el descarte de la nueva línea? Por ejemplo: 'scanf (" \ n% c ", & achar);' funcionaría también. – cpx

+2

@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

0

Pruebe también _flushall() después de cada llamada printf. . Básicamente, de forma predeterminada, la salida de flujo de búfers de C++ de MS y el lavado hacen que la secuencia de salida se vacíe.

0

llamando al 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 en el que sabemos que sólo uno está en la cola de valor y no una cadena

Cuestiones relacionadas