2012-10-11 34 views
9

Considere el siguiente código:espacio en blanco en la cadena de formato (scanf)

#include<stdio.h> 
int main() { 
    int i=3, j=4; 
    scanf("%d c %d",&i,&j); 
    printf("%d %d",i,j); 
    return 0; 
} 

Funciona si darle o 2c32 c 3 o 2c 3 como entrada si tengo que cambiar el valor de las variables. ¿Qué debo hacer si deseo que el usuario ingrese el mismo patrón que yo quiero decir si %dc%d entonces solo 2c3 es aceptable y no 2 c 3 y viceversa si es %d c %d?

Respuesta

10

Espacios en blanco en la cadena de formato coincide con 0 o más espacios en blanco en la entrada.

Así que "%d c %d" espera el número, luego cualquier cantidad de caracteres en el espacio en blanco, luego el carácter c, luego cualquier cantidad de caracteres en el espacio en blanco y otro número al final.

"%dc%d" espera el número, c, número.


También tenga en cuenta, que si se utiliza * en la cadena de formato, se suprime la asignación:
%*c = leer 1 carácter, pero no le asigne a cualquier variable

Así que usted puede utilizar "%d%*c c%*c %d" si desea forzar usuario para ingresar: número, al menos 1 carácter seguido de cualquier cantidad de caracteres en blanco, c, al menos 1 carácter seguido de cualquier cantidad de espacios en blanco de nuevo y número.

+2

Mientras correcta, esto en realidad no responde a la pregunta de cómo proceder si quieres insistir en el espacio en blanco o no en el espacio en blanco. – Vicky

+1

Esta respuesta implica incorrectamente que el espacio en blanco no está permitido antes del número entero. '"% dc% d "' espera cualquier cantidad de caracteres en blanco, número, ''c'', cualquier cantidad de caracteres en blanco, número. – chux

0

Creo que leería el resultado del escaneo en diferentes variables (es decir, no reutilizaría i y j) como "%d%s%d". Luego, verifique la cadena que obtuvo de% s y si coincide con sus requisitos, use las otras variables para sobrescribir i y j.

0

Fuerza una cadena analizar en primer lugar:

char a[100], b[100]; 
scanf("%99s c %99s", a, b); 

A continuación, utilice sscanf() para convertir las cadenas a int.

4

Si desea aceptar 1c2 pero no 1 c 2, utilice el patrón sin el espacio:

scanf("%dc%d", &x, &y); 

Si desea aceptar 1c2 y 1 c 2 (y también 1 \t \t c \t 2 etc.), utilice el patrón con el espacio:

scanf("%d c %d", &x, &y); 

Si desea aceptar 1 c 2 pero no 1c2, añadir una cadena que contiene espacios en blanco falsa:

scanf("%d%*[ \t]c%*[ \t]%d", &x, &y); 

Aquí el formato de cadena %[ \t] significaría "leer una cadena que contiene cualquier número de caracteres de espacio y tabulador"; pero utilizando el * adicional, se convierte en " esperan una cadena que contiene cualquier número de caracteres de espacio y tabulador, y luego descartarlo "

+0

El espacio antes de '"% d "' in '"% d c% d "' es irrelevante, el mismo resultado que '' "% d c% d" ''. El espacio en blanco será aceptable incluso sin ese espacio principal. – chux

Cuestiones relacionadas