Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [C] stringhe e vettori di stringhe

    Ciao a tutti,

    molto brevemente ho un problema con questo pezzo di codice

    for(i=0;i<9;i++)
    {
    gets(stringa);
    strcpy(parola[i],stringa);
    }

    oppure

    for(i=0;i<9;i++)
    {
    gets(parola[i]);
    }

    dove parola[i] e dichiarato come CHAR * PAROLA[I]

    ora dato che parola[i] e un vettore di puntatori, e sul libro fa vedere che volendo si puo inizializzare tale vettore con strighe, per esempio cosi vettore[2]={"pippo","mario").

    La domanda e:

    perche con il ciclo for tutto questo non funziona?

    e sbagliato il concetto oppure solo la forma della sintassi?

  2. #2
    È sbagliato il concetto: quando tu scrivi questo:
    codice:
    char * vettore[2]={"pippo","mario")
    il compilatore alloca le due stringhe sullo stack e ne assegna i puntatori a vettore; ma gets non alloca un bel niente, si limita a scrivere nella locazione di memoria dove punta il puntatore che gli passi, che, essendo il tuo array non inizializzato, non si sa dove punterà. La soluzione corretta è dichiarare vettore come array di array di caratteri:
    codice:
    char vettore[2][80]; //Dove 80 è il numero massimo di caratteri che sei disposto ad accettare
    .
    Consiglio: non usare gets, è una funzione che rischia di causarti buffer overrun.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Solo per precisare che, in questi casi, le stringhe non sono allocate nello stack ...

    Esse sono costanti e vengono inserite dal compilatore e dal linker all'interno di segmenti costanti (come se facessero parte del codice) che non possono essere modificati.
    Da cui la causa del problema in scrittura ...

  4. #4
    Ottima precisazione; ora ne so di più anch'io .
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5

    Ok

    Innanzitutto grazie per le rispo,

    ho pero voluto sviscerare il problema ancora un po debuggando e ho notato queste cose:

    parola[0]="pippo";
    parola[1]="mario";
    parola[2]="luigi";
    parola[3]="Ercole";

    dopo la sequenza di queste quattro istruzioni, nelle locazioni parola[0], parola[1] etc ci sono quattro indirizzi diversi, la cosa mi piace perke appunto vuol dire ke puntano a 4 stringhe differenti...ora dopo queste istruzioni ho provato a mettere questa

    for(i=0;i<4;i++)
    {
    gets(stringa);
    parola[i]=stringa;
    }

    (qui faccio un inciso per Mitaly: non incazzarti se ho messo ancora gets, il tuo consiglio lo seguo solo che ora volevo appunto sviscerare un po la cosa )

    ebbene ho visto il valore dei puntatori in parola[i] e ho notato questa cosa:

    dopo la prima gets(stringa) parola[0] assume un valore...e mi puo andar bene....dopo la seconda gets, e quindi con i=1, in parola[1] viene scritto riscritto il valore del puntatore che ce in parola[0]!!!!!!!!!!!!!!!!!!!!!!!!! cosi alla fine del ciclo, avendo immesso quattro nomi diversi, mi ritrovo nel vettore di puntatori tutte e quattro le caselle che puntano all ultimo nome immesso!!!! E in ogni casella parola[i] ce l indirizzo scritto dopo la prima gets(stringa)!!!

    Ma come mai succede cio? come mai viene riscritto in tutte le caselle di parola[i] sempre lo stesso indirizzo relativo alla prima chiamata di gets?

    :master:

  6. #6

    mmm

    come al solito ho scritto troppo presto :rollo: :rollo:
    credo ke metta lo stesso indirizzo, perke stringa punta sempre alla stessa cella di memoria e gets() non fa altro ke cambiare le parole a quell indirizzo puntato da stringa -.-'

    Dovrebbe essere cosi, se qualcuno ha voglia di confermare...

    In ogni caso faccio pubblica ammenda -.-'

    Saluti!

  7. #7
    Esatto.
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.