theprogrammer (Normal User)
Guru^2
Messaggi: 2509
Iscritto: 28/01/2009
|
Sì ... facci vedere cosa avevi scritto per allocare le stringhe con la malloc.
|
|
Lawliet (Normal User)
Expert
Messaggi: 386
Iscritto: 09/04/2009
|
Eccomi, scusa se mi sono assentato:
Avevo fatto così (ho appena "migliorato"):
Codice sorgente - presumibilmente C/C++ |
char *str;
str = malloc( sizeof(char *));
str = stringa[0];
fwrite(str, sizeof(char *), 1, fp);
|
stranamente mi funziona però con un difetto che mettendo "ciao" mi appare "ciao-" perchè?
Codice sorgente - presumibilmente C/C++ |
char *str;
str = malloc( sizeof(char *));
fread(str, sizeof(char *), 1, fp);
stringa[0] = str;
|
EDIT: anche scrivendo "balblablalba" mi spezza e mi dà una parte della stringa inserita sempre con il trattino finale.
Devo aver capito male come usare la malloc. Ultima modifica effettuata da Lawliet il 30/06/2009 alle 17:04 |
|
theprogrammer (Normal User)
Guru^2
Messaggi: 2509
Iscritto: 28/01/2009
|
Devo aver capito male come usare la malloc. |
Sì, il motivo e' proprio questo.
La malloc alloca byte di memoria e assegna l'indirizzo al puntatore.
Quindi, quando scrivi
Codice sorgente - presumibilmente C/C++ |
char *str;
str = malloc( sizeof(char *));
|
stai allocando solamente 4 byte per la tua stringa perche' la sizeof che hai scritto restituisce proprio 4. Se vuoi prevedere un certo numero di caratteri (diciamo 50 + 1 per il terminatore) devi scrivere
Codice sorgente - presumibilmente C/C++ |
char *str;
str = (char *)malloc(51 * sizeof(char));
|
e nota bene che la sizeof deve prevedere il tipo char e non il tipo char *
Per scrivere su file la stringa, dopo averla letta da tastiera, dovrai scrivere in modo analogo
Codice sorgente - presumibilmente Plain Text |
fwrite(str, 51 * sizeof(char), 1, fp);
|
e per leggere
Codice sorgente - presumibilmente Plain Text |
fread(str, 51 * sizeof(char), 1, fp);
|
|
|
Lawliet (Normal User)
Expert
Messaggi: 386
Iscritto: 09/04/2009
|
Corretto, funziona tutto! Grazie, però ora il dubbio è che se metto però una stringa lunga 100 caratteri come faccio? Potevo usare la strlen però poi a leggere, viene sballato.. :S
Devo sempre dare una dimensione "massima" come punto di riferimento?
|
|
theprogrammer (Normal User)
Guru^2
Messaggi: 2509
Iscritto: 28/01/2009
|
Devi dare una dimensione massima ... ecco perche' ti parlavo di 8 k per il buffer ...
Per l'input usa la fgets e non la gets perche' cosi' puoi indicare la dimensione massima del buffer e non incorrerai in buffer overflow.
|
|
Lawliet (Normal User)
Expert
Messaggi: 386
Iscritto: 09/04/2009
|
Uff, odio dare una dimensione massima.. preferisco che la dimensione la si acquisisce mentre va in corso il programma
Ok grazie di tutto ancora.
|
|
theprogrammer (Normal User)
Guru^2
Messaggi: 2509
Iscritto: 28/01/2009
|
E' un modo comodo e pratico ... se vuoi proprio complicarti la vita devi
1) impostare un ciclo in cui prelevi un carattere alla volta
2) inserisci i caratteri pressati fino al RETURN in un buffer che hai allocato all'inizio con 1 byte
3) utilizzi la funzione realloc() per modificare la dimensione del buffer allocato in precedenza
4) alla fine, deallochi il buffer con la free
e considera che non esistono funzioni standard per realizzare il punto 1) ma ti dovrai affidare ad API specifiche del sistema operativo.
Insomma ... non ne vale la pena ...
|
|
Lawliet (Normal User)
Expert
Messaggi: 386
Iscritto: 09/04/2009
|
Ok. come non detto! Grazie ancora! ^^
|
|