2011-07-05 27 views
7
#include <stdio.h> 
int main(int argc, char* argv[]) { 
    char c; 
    scanf(" %c", &c); 
    printf("%c\n", c); 
    return 0; 
} 

[[email protected]]# ./scanf 
a 
a 

[[email protected]]# ./scanf 
h 
h 

Parece que siempre coincide si existe espacio, ¿por qué?¿Qué significa espacio en scanf?

+1

http://linux.die.net/man/3/scanf, http://www.manpagez.com/man/3/scanf/, http://unixhelp.ed.ac.uk/CGI/ man-cgi? scanf + 3, GIYF – sehe

Respuesta

9

espacio en blanco (por ejemplo, espacios en blanco, pestañas, o saltos de línea) en la cadena de formato que coincida con cualquier cantidad de espacio en blanco, incluyendo ninguno, en la entrada.

http://www.manpagez.com/man/3/scanf/

+0

¿Coincide con la tecla 'RETURN'? –

+1

@Je Rog: No coincide con "claves". Coincide con la entrada * caracteres *. Y el carácter de nueva línea se considera espacios en blanco, por lo que sí, omitirá el carácter de nueva línea. – AnT

+0

Sí, el espacio se puede usar para que coincida con "nueva línea". Tenga cuidado, en Windows cuando presione RETORNO, generalmente envía "\ r \ n" y en Linux solo "\ n". Pero para un simple escaneo de entrada numérica, eso normalmente no importa porque la conversión de números se detendrá tan pronto como llegue a un no dígito ('.'' -' y' + 'están permitidos dependiendo del tipo de entrada que está escaneando) –

4

espacio en formato scanf significa "saltar todos los espacios en blanco" de la posición actual en. Dado que la mayoría del especificador de formato scanf ya omitirá todos los espacios en blanco antes de intentar leer algo, el espacio no se usa en el formato scanf la mayor parte del tiempo. Sin embargo, cuando utiliza un especificador de formato que no ignora el espacio en blanco, incluir espacio en el formato cuando sea necesario (forzar el salto) puede tener sentido.

Los especificadores que no ignoran el espacio en blanco son c[ y n. Entonces, especificar un espacio frente a uno de esos especificadores hace la diferencia. De lo contrario, no hace ninguna diferencia. En su ejemplo específico, el espacio en blanco se ignora específicamente porque utilizó un espacio en su formato scanf (ya que está usando %c). Intente eliminar el espacio y vea qué sucede.

2

Un espacio en blanco en la cadena de formato ignorará 0 o más espacios en blanco de la entrada, hasta que la primera no está en blanco.

1

El documentation for scanf dice:

una directiva compuesta por uno o más espacios en blanco caracteres serán ejecutadas por la lectura de entrada hasta que no hay entrada más válida se puede leer, o hasta el primer byte que no es una carácter de espacio en blanco, que permanece sin leer.

Y también caracteres de espacio en blanco

de entrada (como se especifica por isspace) se omiten, a menos que la especificación de conversión incluye una [, c, C, o n especificador de conversión.

Lo que significa que se necesita espacio en la cadena de formato. Si se va a leer un número entero, sin embargo, el espacio habría sido redundante:

/* equivalent statements */ 
scanf(" %d %d %d", &v1, &v2, &v3); 
scanf("%d%d%d", &v1, &v2, &v3); 
0

El% C no saltará carbón espacios en blanco como especificadores de formato numérico hacen. tanto, si utiliza:

#include<stdio.h> 
int main(int argc, char* argv[]){ 
    char c; 
    scanf("%c", &c); 
    printf("%c\n", c); 
    scanf("%c", &c); // Try running with and without space 
    printf("%c\n", c); 
    return 0; 
} 

Es muy probable que el espacio en blanco anterior en el buffer de entrada se realizará en el segundo scanf, y usted no tendrá la oportunidad de escribir. El espacio antes de% c hará que scanf omita cualquier carácter de espacio en blanco que esté en el búfer de entrada para que pueda ingresar su entrada correctamente. a veces para conseguir los mismos efectos escriben:

fflush(stdin); 
scanf("%c" &c); 

Pero esto se considera muy mala programación como C estándar especifica el comportamiento de fflush (stdin) no está definido. Así que siempre use espacio en la cadena de formato a menos que tenga una razón específica para capturar espacios en blanco también.