Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    140

    [C] problema lettura stringa

    Ciao, ho scritto un programmino in cui leggo così una stringa dinamica:

    codice:
    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

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Scusa ... ma tu come usi questa funzione? Qual e' il main?

    A cosa servono queste

    int l;
    char *temp;

    dato che non le usi?

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    140
    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?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ti avevo chiesto di mostrarmi il main, nella porzione in cui richiami la leggiNome ...

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    140
    Certo capo...

    codice:
    	case 'e': 
    		while(isspace(temp = getchar())); 
    		w1 = leggiNome(temp);
    		esemplari(w1);
    		break;
    w1 è un *char

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ho eseguito il codice e non mi ha dato problemi ...

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    140
    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è?

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    140
    Quello è solo un esempio, sono 2000 righe di codice tutto il pgm, richiamo quella funzione più volte su input diversi, non posso elencarli tutti.

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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 ...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.