PDA

Visualizza la versione completa : [C] Crash in lettura di una stringa dinamica


kappa85
15-02-2007, 17:00
Ciao, ho scritto un programmino in cui leggo cos una stringa dinamica:



char *leggiNome(char c) {
int i = 1;
int l;
char *temp;
char *nome = malloc(2*sizeof(char));
while(c >= 'a' && c <= 'z') {
nome[i - 1] = c;
nome = (char *)realloc(nome, ++i * sizeof(char));
c = getchar();
}

nome[i - 1] = '\0'; /* Fine nome */
return nome;
}

nel resto del programma la stringa nome sempre associata a puntatore a carattere, e mai a stringhe preallocate come ad esempio stringa[15]. Il problema che se le stringhe sono pi lunghe di 7 caratteri il programma crasha, se le metto tutte al max di 7 lettere funziona tutto perfettamente. Sapete dirmi perch?

mi pare di ricordare che certe stringhe siano in effetti memorizzate come abcdefgh\x1

oregon
15-02-2007, 17:19
Scusa ... ma tu come usi questa funzione? Qual e' il main?

A cosa servono queste

int l;
char *temp;

dato che non le usi?

kappa85
15-02-2007, 18:01
Ovviamente l e temp non servono, sono rimaste li da codice cancellato... In pratica il programma legge dei nomi e li memorizza in una lista dinamica. Il problema nasce quando poi scorro la lista e faccio dei confronti sui nomi precedentemente memorizzati... salta fuori che alcune stringhe di 8 caratteri sono memorizzate come abcdefgh/x1 o qualcosa del genere, cio gli 8 caratteri giusti pi un carattere di sporcizia. Questo avviene solo con le stringhe di 8+ caratteri, fino a 7 tutto normale. C' qualcosa nell'allocazione dinamica che non va?

oregon
15-02-2007, 21:38
Ti avevo chiesto di mostrarmi il main, nella porzione in cui richiami la leggiNome ...

kappa85
15-02-2007, 23:11
Certo capo...



case 'e':
while(isspace(temp = getchar()));
w1 = leggiNome(temp);
esemplari(w1);
break;


w1 un *char

oregon
15-02-2007, 23:19
Ho eseguito il codice e non mi ha dato problemi ...

kappa85
15-02-2007, 23:24
Vedi che non hai letto bene... non mi da problemi l'esecuzione del blocco, ma sbagliata la maniera con cui le stringhe sono memorizzate. Non tutte, solo quelle pi lunghe di 7 caratteri. Dando in input stringhe fino a 7 caratteri esse sono scritte e memorizzate correttamente. Esempio:

con la funzione sopra leggo "ciao" ---> x="ciao"
un blocco di codice successivo fa un confronto tra stringhe: strcmp(x,"ciao"), questo ha successo e ritorna vero

ma se leggo ---> x="abcdefgh"ritornando falso perch la stringa di 8 caratteri.

Perch?

oregon
15-02-2007, 23:26
Anche tu non hai letto bene ... se ti ho detto che non da' problemi vuol dire che funziona correttamente, anche la memorizzazione della stringa.

Allora il problema non e' nella

leggiNome

ma probabilmente nella funzione

esemplari

che tratta quel dato, ma che io non posso provare.

kappa85
15-02-2007, 23:29
Quello solo un esempio, sono 2000 righe di codice tutto il pgm, richiamo quella funzione pi volte su input diversi, non posso elencarli tutti.

oregon
15-02-2007, 23:41
Beh ... l'input funziona anche per stringhe piu' lunghe di 8 caratteri ... se il problema e' da un'altra parte e non puoi mostrare il codice, mi dispiace ...

Loading