PDA

Visualizza la versione completa : [C] Miglior modo per memorizzare una stringa inserita dall'utente


Vyse220
17-12-2010, 23:58
Salve ragazzi, sono ancora scarso in programmazione, mi chiedevo, come memorizzare una stringa nel migliore dei modi?

se utilizzo scanf allora rischio di sforare l'array e non ci mette il carattere terminatore, se uso un ciclo con il getche() allora ci son problemi con il cancellare un carattere e andare indietro e altri problemi in generale.

come fate voi?

grazie in anticipo

Alex'87
18-12-2010, 00:02
Originariamente inviato da Vyse220
se utilizzo scanf allora rischio di sforare l'array e non ci mette il carattere terminatore scanf il terminatore lo mette...

ramy89
18-12-2010, 00:05
Se non sai come allocare memoria per una stringa in modo dinamico allora ti conviene usare gets (http://www.cplusplus.com/reference/clibrary/cstdio/gets/).
Però devi dichiarare l' array di caratteri con una dimensione predefinita.
Altrimenti io dichiaro un puntatore e utilizzo questa funzione:


char* get_string(FILE *fp)
{
char *ptr;
ptr=(char*)malloc(sizeof(char));
if(ptr==NULL)
{
perror("Errore di lettura/inserimento dei dati\n");
return ptr;
}
int i=1,ci;
if(fp==stdin)
fflush(fp);
else
{
ci=fgetc(fp);
if(ci!='\n')
fseek(fp,-1,SEEK_CUR);
}
ptr[0]='\0';
while(ci!=10&&ci!=EOF)
{
ptr=(char*)realloc(ptr,i*sizeof(char));
if(ptr==NULL)
{
perror("Errore di lettura/inserimento dei dati\n");
return ptr;
}
ci=fgetc(fp);
if(ci!=10)
ptr[i-1]=ci;
else
ptr[i-1]='\0';
i++;
}
return ptr;


Che tra l' altro uso anche per leggere da file.

Vyse220
18-12-2010, 00:16
Originariamente inviato da Alex'87
scanf il terminatore lo mette...
Si ma se sfora l'array e va in overflow allora viene facilmente sovrascritto e la stringa perde il suo significato.

Stessa cosa mi pare faccia il gets, qual'è la differenza?

MItaly
18-12-2010, 00:23
Originariamente inviato da ramy89
Se non sai come allocare memoria per una stringa in modo dinamico allora ti conviene usare gets (http://www.cplusplus.com/reference/clibrary/cstdio/gets/).
gets va evitata assolutamente in quanto non consente di evitare i buffer overflow. Si usa piuttosto fgets.

Vyse220
18-12-2010, 00:27
Originariamente inviato da MItaly
gets va evitata assolutamente in quanto non consente di evitare i buffer overflow. Si usa piuttosto fgets.

la stavo leggendo proprio adesso infatti, mi pare di capire che la funzione termina da sola aggiungendo il terminatore non appena raggiunto il numero di caratteri richiesto?
Non dovrei avere casi di ambiguità o altri problemi

è proprio quello che mi serviva :D
grazie a tutti

Vyse220
18-12-2010, 18:37
scusate il doppio post, ma a quanto pare l'fget mi inserisce un \n a fine stringa, come posso rimediare?

MItaly
18-12-2010, 21:05
Non lo inserisce, semplicemente non lo toglie (l'utente effettivamente quando inserisce il testo inserisce un newline).
Comunque:


stringa[strlen(stringa)-1]=0;

Loading