Array di stringhe

di il
22 risposte

Array di stringhe

Ciao a tutti!
Mi scuso per il disturbo ma ho un problema con gli array di stringhe.
Praticamente devo leggere da un file dei nomi (in ogni riga c'è un nome) e metterli dentro ad un array di stringhe per poi passarlo ad una funzione.
Il mio intento è quello di non creare una matrice, quindi uso una struct:


struct str
{
   char nome[10];
} persona[6];

Uso 6 e 10 perché nel file ci sono 6 nomi di persone, il cui nome al massimo è costituito da 10 cifre (non lo devo fare dinamico il vettore ..)
A questo punto nel main, dopo aver aperto correttamente in modalità lettura il file, incomincio a leggere il file

char str[6];
int i = 0;
while (fscanf(f, "%s", persona->nome) >0)
{
    str[i] = persona->nome[i];
    i++;
}
Il problema è che mi legge solo la prima lettera di ogni nome ..
Dove sbaglio?

22 Risposte

  • Re: Array di stringhe

    Non vorrei sbagliarmi, ma persona è un Array , quindi deve avere anch esso un indice per scorrerlo, non solo nome.

    Inoltre, se nome può contenere fino a 10 caratteri lo dovresti definire di 11 elementi (considera che devi lasciare il posto al '\0' finale)
  • Re: Array di stringhe

    Ci sono un bel po' di errori...
    Intanto se il dato è lungo 10 caratteri la stringa deve essere di almeno 11 per il terminatore
    In secondo luogo devi leggere nel vettore persona con
    persona.nome
    e str non c'entra
  • Re: Array di stringhe

    Ah ho capito...
    Quindi diventa:
    
    int i = 0;
    while( fscanf(f, "%s", persona[i].nome) > 0)
    {
        i++;
    }
    
    Infatti adesso funziona... Grazie mille!
    Ah un'ultima cosa..
    Quando passò alla funzione l'array di stringhe:
    
    funzione(persona);
    
    Dopo quando vado ad implementare la funzione mi dà un errore..
    
    void funzione( char vettore[6])
    {
       .....
    }
    
    Mi dice che str[6] e char* sono tipi incompatibili..
  • Re: Array di stringhe

    Char str[6] è un Array di char..
    char * è un puntatore ad una posizione di memoria che contiene un char. non sono la stessa cosa.

    inoltre, l'etichetta della struttura è str? cambiala per evitare confusione.
  • Re: Array di stringhe

    Ok forse ci sono..

    Ho modificato il nome dell'etichetta
    
    struct string
    {
         char nome[11];
    } persona[6]
    
    Chiamo la funzione
    
    funzione(persona);
    
    Eh nel l'implementazione della funzione :
    
    void funzione( struct string *vett)
    {
        ....
    }
    
    Il problema adesso è che alla funzione gli ho passato solo il primo nome e non tutti e 6
  • Re: Array di stringhe

    La funzione chiamata aspetta un puntatore alla prima posizione ,

    non vorrei dire bagianate, ma gli elementi delle strutture non sono per forza di cose sequenziali, qindi non so se passando il puntatore alla prima cella di memoria, è lo stesso di passare tutta la struttura, non credo.

    cioè.. la funzione chiamata aspetta un puntatore ad una cella di memoria, ma questo potrebbe funzionare con gli Array che hanno le celle adiancenti in memoria, ora tu stai passando persona , ma la funzione chiamata aspetta un puntatore ad 1 cella .
    in questo caso di trutt di 1 solo elemento non so se la procedura sia lecità, in caso di più elementi nella struttura, mi sa di no.

    io avrei passato elemento per elemento

    persona
  • Re: Array di stringhe

    Si che sono consecutivi... Però la struttura si chiamava str non string
  • Re: Array di stringhe

    La struct l'ho modificata con string ..
    Eh purtroppo nella funzione mi serve l'intero array di stringhe.. Altrimenti se avessi potuto passare elemento per elemento l'avrei fatto...
  • Re: Array di stringhe

    oregon ha scritto:


    Si che sono consecutivi... Però la struttura si chiamava str non string
    persona
    ha tutti gli elementi consecutivi?
    cioè visto che persona ha un sdolo elemento dentro, ok.
    Ma nel caso fosse
    
    struct s{
    int a;
    int b;
    }persona;
    
    persona.a e persona.b sono sempre in celle adiacenti?
  • Re: Array di stringhe

    Due campi all'interno della stessa struttura sono consecutivi (a parte l'allineamento usato).
    Ma tu parlavi di due elementi di un vettore di strutture e anche questi sono consecutivi in memoria (facendo riferimento alla size della struct).
  • Re: Array di stringhe

    Quindi però non si riesce a passare alla funzione l'intero array di stringhe?
  • Re: Array di stringhe

    Certo che si ... tu avevi scritto

    void funzione( struct string *vett)

    e io ti ho chiesto perché hai scritto string se la struttura l'hai chiamata str ?
  • Re: Array di stringhe

    Quindi , parlando di celle di memoria, i campi delle strutture sono consecutivi,

    quindi quando si dice che per la dimensione della struttura si deve usare sizeof e non la somma dei singoli campi, perchè possono esserci "buchi" o cosa si riferiscono?
  • Re: Array di stringhe

    Ho modificato la struct in:
    
    struct string
    {
         char nome[11];
    } persona[6];
    
Devi accedere o registrarti per scrivere nel forum
22 risposte