scanf non superare sovraccarico del buffer
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?
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.