Cuando uso la función scanf , he estado usando una cadena de formato como scanf("%d",&x); . Sin embargo, tengo curiosidad por algo de hace unos días, así que estoy haciendo una pregunta.
¿Qué sucede cuando pones un carácter entre comillas de la función scanf ?
Ejemplo:
printf("Please enter the date you were born: ex.1999/5/6 : ") scanf("%d/%d/%d", &year, &month, &date);scanf lee un flujo de datos de stdin e intenta analizar su cadena de formato. Si no encaja, deja de procesarse. Es importante comprender que el resto de la entrada permanece en el flujo stdin para lecturas posteriores. scanf devuelve el número de valores que se han analizado con éxito.
Según mi experiencia, lo mejor es escribir un pequeño programa y probar el comportamiento por ti mismo:
#include "stdio.h" void main() { int year = 0; int month = 0; int date = 0; int count; while (1) { printf("enter data:\n"); count = scanf("%d/%d/%d", &year, &month, &date); printf("data received:\n"); printf("%d-%d-%d count=%d\n", year, month, date, count); } }Ejemplo 1: Comience de nuevo e ingrese los datos correctos:
enter data: 1/2/3 data received: 1-2-3 count=3Ejemplo 2: Empezar de cero e introducir datos erróneos:
enter data: 1 2 3 data received: 1-0-0 count=1 enter data: data received: 2-0-0 count=1 enter data: data received: 3-0-0 count=1 Puede ver que scanf lee los datos solo hasta el espacio después 1 porque no se ajusta a la cadena de formato. scanf solo cambia el valor de la primera variable. Aún así, el resto de su entrada, que es 2 3 , está en stdin . El ciclo continúa y la siguiente llamada a scanf lee 2 . Se omite el espacio delante del número. ¡Esto sucede sin ninguna interacción del usuario! De nuevo, no se encuentra ninguna barra. Y así. Pruébelo usted mismo con diferentes casos y comprenda que usar scanf es algo peligroso ... y si no inicializa las variables y el análisis falla, ¡obtendrá datos no inicializados!
¿Qué sucede cuando pones un carácter entre comillas de la función scanf?
Hace que la función omita una aparición de ese carácter exacto del flujo de entrada, siempre que el siguiente carácter que se lea sea una coincidencia. Si el siguiente carácter no coincide, la llamada a scanf fallará en ese punto.
De cppreference :
La cadena de formato consta de
- caracteres multibyte sin espacios en blanco excepto %: cada uno de estos caracteres en la cadena de formato consume exactamente un carácter idéntico del flujo de entrada, o hace que la función falle si el siguiente carácter en el flujo no se compara igual.
Entonces, considere lo siguiente:
int i, j; int count = scanf("%dbob%d", &i, &j); Para una entrada de 1bob2 , esto leerá con éxito los valores de 1 y 2 en i y j , respectivamente (omitiendo los 3 caracteres bob ), y el valor de count devuelto será 2 .
Sin embargo, para una entrada de 1Bob2 , el 1 se leerá en i y luego la llamada fallará, porque el siguiente carácter ( B ) no es b , y el valor de count devuelto será solo 1 . Lo mismo ocurrirá con 1bOb2 y 1boB2 .