Visualizza versione completa : Fine Array in C
Ciao a tutti,
di solito, se non ne so prima il contenuto, dichiaro un array di char in questo modo:
#define SIZE 1024
char miaStringa[SIZE];
nell'esecuzione del programma come posso intercettare se si prova a scrivere oltre "miaStringa[SIZE-1]"?
es: acquisendo una stringa con gets(miaStringa), se l'utente scrive un poema crea un bel pasticcio...
spero di essermi spiegato decentemente... (D)
Ciao
P8257 WebMaster
13-07-2004, 17.07.14
Usi la strlen....
size_t strlen(const char *s);
Ma se fai una "gets" e l'utente (che ha sempre il diavolo in corpo) ti fa andare in buffer overflow .. tu per sicurezza metti li terminatore '\0' all'ultimo carattere della tua stringa (dopo aver fatto gets) .. in questo modo ti assicuri che qualsiasi chiamata a funzioni successive provocherà una letura non oltre il terminatore...
Consiglio sempre di prendere l'input carattere per carattere... questo almeno in C puro.
Bye :cool:
scusa la mia ignoranza ma... cosa rappresenta "size_t"?
per il resto quindi:
gets(stringa);
stringa[SIZE-1] = '/0';
così? ma nella parte di memoria eccedente che ho occupato con gets() non sovrascrivo?
P8257 WebMaster
13-07-2004, 17.26.25
Diciamo che size_t è un tipo specifico per le "misure" .. praticamente in questo caso è un int.. size_t è una convenzione che si usa in fase di misurazioni o in return di valori di lunghezza...
Certo che sovrascrivi (a meno che la funzione non sia progettata per non farlo.. molte funzioni lo sono compresa "gets").. ma almeno eviti di leggere o di fare operazioi con le schifezze .. ecco perché consiglio di prendere sempre l'input carattere per carattere...
Bye :cool:
(Y) grazie...
sei fantastico.... (L)
:D :D :D :D :D :D :D :D :D :D
pholcus
13-07-2004, 21.29.48
Usa fgets , mai gets, nn e' sicura..
char * fgets(char *str, int size, FILE *stream);
Al piu' vengono letti size-1 caratteri, e sei a posto, nn devi fare altri controlli ;)
P8257 WebMaster
13-07-2004, 22.37.40
(Y) :)
Bye :cool:
... ho scritto:
fgets(stringa, SIZE-2);
come "FILE *stream" cosa metto? non ho bisogno di salvarlo!
posso fare una cosa di questo tipo? :
fgets(stringa, SIZE-2, stringa)
ciao...
:D ... ho messo "stdin" ... scusate ma ho sonno questa mattina :D
(S)
(S)
(S)
(S)
e ho notato che SIZE-2 non è corretto....
LoryOne
14-07-2004, 10.16.28
fgets(tua stringa,sizeof(tua stringa),stdin);
pholcus
14-07-2004, 13.19.05
#define STR_SIZE 4096
char string[STR_SIZE];
fgets(string, STR_SIZE, stdin);
;)
vBulletin® v3.8.6, Copyright ©2000-2025, Jelsoft Enterprises Ltd.