Leer N caracteres en C/C++ con scanf + vaciar buffer
Hola, en esta ocasión quería compartirles un pequeño snippet de código de C/C++ que encontré un día de estos: Como leer una cadena de N caracteres con scanf.
Supongamos que queremos leer como máximo los primeros 8 caracteres que ingrese el usuario en la entrada estándar (stdin), y guardaremos el resultado en un arreglo de caracteres. Para ello, primero declaramos el arreglo con una longitud de 9 posiciones, que corresponderán a los 8 caracteres que deseamos leer, más una posición más para el caracter nulo, que marcará el fin de la cadena.
char cadena[9];
Luego procedemos a leer con scanf los 8 caracteres desde la entrada estandar:
scanf("%8s",cadena);
Lo importante a notar es el especificador de formato s, que indica que lo que se leerá es una cadena de caracteres (string). La entrada se termina con un espacio en blanco, pero el número 8 indica que solamente se tomarán los primeros 8 caracteres que se encuentran en el buffer de la entrada estándar. Además, un caracter nulo es guardado al final de la cadena de caracteres. Es por ello que el arreglo utilizado debe ser por lo menos un caracter más grande que la longitud de entrada especificada. De no ser así podría darse el caso que se sobrescriban porciones de memorias adyacentes, generando resultados inesperados.
Finalmente, para limpiar el buffer de la entrada estándar: leer mientras se encuentre el caracter de salto de línea (\n) o el caracter de finalización.
char c; while ((c = getchar()) != '\n' && c != EOF) { }
El código completo es el siguiente:
Saludos.