que lenguaje hace función formato especificadores dev cadenas c char scanf format-specifiers

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''.