Pregunta

Tengo un búfer y no quiero que el usuario introduzca más caracteres que el búfer puede contener (para evitar una saturación del búfer).

Estoy utilizando scanf y han hecho de esta manera:

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

Sin embargo, sé que estoy protegido si el usuario introduce más de 30. Sin embargo, si el usuario introduce más de 30, se dará por terminado el buffer nula?

¿Fue útil?

Solución

scanf() con un indicador de conversión "% s", añade un carácter nulo de terminación de la memoria intermedia.

Pero , que está pidiendo 30 caracteres, lo que significa realmente 31 y sólo tienen espacio para 30. Se debe utilizar una anchura máxima de campo de 29.

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

También tenga en cuenta que el indicador de conversión "%c" funciona más o menos como "%s", pero no agrega el carácter nulo de terminación y no descarta el espacio de la entrada. Dependiendo de lo que se espera, podría ser mejor que usar "% s".

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

Otros consejos

Desde el manual scanf:

  

s ajusta con una secuencia de   caracteres no de espacio 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 terminador. los              cadena de entrada se detiene en el espacio en blanco o en la anchura máxima del campo,              lo que ocurra primero.

Se está invocando UB. Proveedores:

#define str(x) #x
#define xstr(s) str(x)
#define BUFSIZE 30

char buffer[ BUFSIZE + 1 ];
scanf("%" xstr(BUFSIZE) "s", buf);

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

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

También debe comprobar si el usuario ha introducido retorno / salto de línea y terminar scanf si tiene:

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

y es una buena práctica para comprobar si hay valores de retorno, por lo que:

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

y, por último, comprobar si la hay nada a la izquierda (como por ejemplo el salto de línea, y lo consumen):

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

Usted tendrá una saturación del búfer porque no ha permitido el carácter NUL terminador. Declarar su buffer de la siguiente manera:

char buffer[31];

y se le multa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top