lenguaje - ¿Qué significa un asterisco en un especificador de formato scanf?
scanf dev c++ (3)
Esta pregunta ya tiene una respuesta aquí:
Así que me topé con este código y no he podido averiguar cuál es el propósito de este, o cómo funciona:
int word_count;
scanf("%d%*c", &word_count);
Lo primero que pensé fue que %*d
hacía referencia a un puntero de caracteres o no word_count
tomara las variables de caracteres.
¿Alguien puede arrojar algo de luz sobre esto?
El *
en "%*c"
significa assignment-suppressing character *
de la assignment-suppressing character *
: si esta opción está presente, la función no asigna el resultado de la conversión a ningún argumento de recepción. 1 Entonces el personaje será leído pero no asignado a ninguna variable.
Notas al pie:
1. fscanf
Para citar el estándar C11
, capítulo §7.21.6.2, fscanf ()
[...] Cada especificación de conversión es introducida por el carácter
%
. Después del%, lo siguiente aparece en secuencia:- Un carácter opcional de supresión de asignación
*
.
- [...]
- Un carácter especificador de conversión
y en cuanto al comportamiento,
[..] A menos que la supresión de la asignación se indique con un
*
, el resultado de la conversión se coloca en el objeto señalado por el primer argumento que sigue al argumento de formato que aún no ha recibido un resultado de conversión. [...]
Eso significa que, en el caso de un especificador de formato como "%*c"
, se leerá un char
desde la stdin
pero el valor escaneado no se almacenará ni se asignará a nada. Por lo tanto, no es necesario proporcionar un parámetro correspondiente.
Entonces, en este caso,
scanf("%d%*c", &word_count);
Es una afirmación perfectamente válida .
Por ejemplo, lo que hace en un entorno * nix es borrar el búfer de entrada de la newline
que se almacena al presionar la tecla ENTRAR después de la entrada.
*c
significa que se leerá un char pero no se asignará, por ejemplo, para la entrada "30a" se asignará 30 a word_count
, pero se ignorará ''a''.