Domanda

Ho un buffer e non voglio all'utente di inserire più caratteri del buffer può contenere (per evitare un sovraccarico del buffer).

Sto usando scanf e che ho fatto in questo modo:

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

Tuttavia, so che sono protetto se l'utente inserisce più di 30. Tuttavia, se l'utente inserisce più di 30, sarà il buffer nullo terminata?

È stato utile?

Soluzione

scanf() con "% s" indicatore di conversione aggiunge un carattere nullo di terminazione nel buffer.

Ma , si sta chiedendo per 30 caratteri, che in realtà significa 31 e hanno solo lo spazio per 30. Si consiglia di utilizzare una larghezza di campo massimo di 29.

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

Si noti inoltre che l'indicatore di conversione "%c" funziona più o meno come "%s", ma non aggiunge il carattere nullo di terminazione e non scartare spazio dall'ingresso. A seconda di ciò che ci si aspetta, potrebbe essere meglio che usare "% s".

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

Altri suggerimenti

Dal manuale scanf:

  

s corrisponde ad una successione di   caratteri non-bianco-spazio; il prossimo   pointer              deve essere un puntatore a char, e la matrice deve essere sufficientemente grande per              accettare tutta la sequenza e il carattere di terminazione NUL. Il              stringa di input ferma a spazi bianchi o alla larghezza massima del campo,              a seconda del caso.

Stai invocando UB. Prova:

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

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

Per ignorare nulla al di là caratteri BUFSIZE sopprimono assegnazione:

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

Si dovrebbe anche verificare se l'utente ha inserito il ritorno / ritorno a capo e terminare scanf se ha:

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

ed è buona norma verificare la presenza di valori di ritorno, in modo da:

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

e, infine, verificare se il c'è qualcosa a sinistra (come ad esempio il ritorno a capo, e consumarlo):

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

Si avrà un sovraccarico del buffer perché non hai permesso per il carattere di terminazione NUL. Dichiarare il buffer in questo modo:

char buffer[31];

e vi andrà bene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top