scanf no debe exceder la saturación del búfer

C99 gcc

Tengo un búfer y no quiero que el usuario ingrese más para evitar un desbordamiento del búfer.

Estoy usando scanf y he hecho esto:

char buffer[30] = {'\0'}; scanf("%30s", buffer); 

Sin embargo, sé que estoy protegido si el usuario ingresa más de 30. Sin embargo, si el usuario ingresa más de 30. ¿Se terminará de forma nula el búfer?

Muchas gracias por las sugerencias,

scanf() con un especificador de conversión “% s” agrega un carácter nulo de terminación al búfer.

Pero estás pidiendo 30 caracteres, lo que realmente significa 31 y solo tiene espacio para 30. Debes usar un ancho de campo máximo de 29.

 char buffer[30] = {'\0'}; scanf("%29s", buffer); 

También tenga en cuenta que el especificador de conversión "%c" funciona casi como "%s" , pero no agrega el carácter nulo de terminación y no descarta el espacio de la entrada. Dependiendo de lo que espere, podría ser mejor que usar “% s”.

 char buffer[30] = {'\0'}; scanf("%29c", buffer); buffer[29] = '\0'; 

Desde el manual de scanf :

s Coincide con una secuencia de caracteres que no son espacios en blanco; el siguiente puntero debe ser un puntero a char, y la matriz debe ser lo suficientemente grande como para aceptar toda la secuencia y el carácter NUL de terminación. La cadena de entrada se detiene en el espacio en blanco o en el ancho máximo del campo, lo que ocurra primero.

Estás invocando UB. Tratar:

 #define str(x) #x #define xstr(s) str(x) #define BUFSIZE 30 char buffer[ BUFSIZE + 1 ]; scanf("%" xstr(BUFSIZE) "s", buf); 

Para ignorar cualquier cosa más allá de BUFSIZE caracteres suprimen la asignación:

 scanf("%" xstr(BUFSIZE) "s%*", buf); 

También debe verificar si el usuario ha ingresado return / newline y finalizar scanf si tiene:

 scanf("%" xstr(BUFSIZE) "[^\n]s%[^\n]*", buf); 

y es una buena práctica verificar los valores de retorno, por lo que:

 int rc = scanf("%" xstr(BUFSIZE) "[^\n]s%[^\n]*", buf); 

y, por último, compruebe si queda algo (como la nueva línea, y consúmalo):

 if (!feof(stdin)) getchar(); 

Tendrá una saturación del búfer porque no ha permitido el carácter NUL de terminación. Declara tu búfer de esta manera:

 char buffer[31]; 

y estarás bien.