PDA

Visualizza la versione completa : [C] Inizializzare vettore di stringhe


Deleted
22-02-2011, 18:08
#include<stdio.h>
#define ELEM 20

void lettura(FILE *output, char *stringa,char **vettore);

int main()
{
FILE *output;
char *vettore[ELEM];//vettore di venti stringhe
char stringa[20];//stringa di venti caratteri
int i;
for(i=0;i<ELEM;i++)
vettore[i]='\0';

if((output=fopen("prova.txt","r"))==NULL)
printf("Impossibile leggere il file!\n");
else
lettura(output,stringa,vettore);
fclose(output);

for(i=0;i<ELEM;i++)
if(vettore[i]!='\0')
printf("%s\n",vettore[i]);

system("pause");
return 0;
}

void lettura(FILE *output, char *stringa,char **vettore){
int i;
for(i=0;!feof(output);i++){
fscanf(output,"%s\n",stringa);
vettore[i]=stringa;
}
}


Questo programma legge dal file prova.txt le varie stringhe contenute al suo interno e le visualizza.
Questo è il contenuto del file:

prova
asd
lol
quarta

E questo è l'output:

prova
asd
lol
quarta
quarta
quarta
quarta
quarta
Premere un tasto per continuare . . .


Come vedete, non mi inizializza il vettore correttamente... Dove sbaglio?

LeleFT
22-02-2011, 18:27
Il linguaggio va obbligatoriamente indicato nel titolo, come richiesto dal Regolamento interno (http://forum.html.it/forum/showthread.php?s=&threadid=973887).

Lo aggiungo io.


Ciao. :ciauz:

Deleted
22-02-2011, 18:29
Si scusa, una dimenticanza :)

_Alfabetagamma_
23-02-2011, 19:15
Prova a fare questo



void lettura(FILE *output, char *stringa,char **vettore){
int i;
fscanf(output,"%s\n",stringa);
for(i=0;!feof(output);i++){

vettore[i]=stringa;
fscanf(output,"%s\n",stringa);
}
}


Siccome feof riconosce se il file è finito dopo che viene letto qualcosa dal file, il problema potrebbe essere questo.

Deleted
23-02-2011, 23:17
Originariamente inviato da _Alfabetagamma_
Prova a fare questo



void lettura(FILE *output, char *stringa,char **vettore){
int i;
fscanf(output,"%s\n",stringa);
for(i=0;!feof(output);i++){

vettore[i]=stringa;
fscanf(output,"%s\n",stringa);
}
}


Siccome feof riconosce se il file è finito dopo che viene letto qualcosa dal file, il problema potrebbe essere questo.

Adesso l'output è questo:


quarta
quarta
quarta
Premere un tasto per continuare . . .

_Alfabetagamma_
23-02-2011, 23:56
Ho messo due printf nella funzione e... funziona XD



void lettura(FILE *output, char *stringa,char **vettore){
int i;
for(i=0;!feof(output);i++){
fscanf(output,"%s\n",stringa);
printf("%s\n", stringa);
vettore[i]=stringa;
printf("%s\n", vettore[i]);
}
}


Stampa le cose che vorresti tu. La domanda è perchè fuori dalla funzione non tiene i valori corretti. L'unica soluzione che mi viene in mente (per quanto brutta) è di non fare la funzione interna, ma di svolgere la funzione nel main (così in teoria funziona).

Rettiffico: Ma certo. Tu nella tua funzione memorizzi la posizione di stringa e alla fine stampi stringa (che contiene quarta e la stampi tre volte). Non è quello che volevi fare tu ma così funziona



#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#define ELEM 20


int main()
{
FILE *output;
char vettore[ELEM][ELEM];//vettore di venti stringhe
char stringa[20];//stringa di venti caratteri
int i;
for(i=0;i<ELEM;i++)
vettore[i][0]='\0';

if((output=fopen("prova.txt","r"))==NULL)
printf("Impossibile leggere il file!\n");
else
{
for(i=0;!feof(output);i++)
{
fscanf(output,"%s\n",stringa);
strcpy(vettore[i], stringa);
}

}
fclose(output);

for(i=0;i<ELEM;i++)
{
if(vettore[i][0]!='\0')
printf("%s\n", vettore[i]);
}
system("pause");
return 0;
}

Deleted
24-02-2011, 00:17
Si sapevo di poter utilizzare una matrice, solo che volevo sperimentare quell'altro metodo, che mi risultava più elegante :). In alternativa ho fatto anche la stessa cosa dichiarando una vettore di strutture contenenti un vettore. Ma volevo capire perchè la mia soluzione nel primo post non andasse. Potrei metterlo nel main, ma i prof agli esami esigono che si utilizzino delle funzioni per qualsiasi cosa... :/

_Alfabetagamma_
24-02-2011, 00:19
Si si, lo so bene XD prova a pensare se dicendo

vettore[i]=stringa

Gli prendi l'indirizzo o la stringa. Se risolvi questo, hai la tua soluzione elegante :)

Cmq io ritengo che:

Meglio una soluzione funzionante e poco elegante, che una elegantissima che non funziona.

Deleted
24-02-2011, 00:25
Originariamente inviato da _Alfabetagamma_
Si si, lo so bene XD prova a pensare se dicendo

vettore[i]=stringa

Gli prendi l'indirizzo o la stringa. Se risolvi questo, hai la tua soluzione elegante :)

Cmq io ritengo che:

Meglio una soluzione funzionante e poco elegante, che una elegantissima che non funziona.

Ci rifletterò su, al massimo mando una mail alla prof per chiarimenti :) . Grazie per l'aiuto.

Laikius91
24-02-2011, 10:30
Mi inserisco anche io con qualche riflessione:



for(i=0;i<ELEM;i++)
vettore[i]='\0';


Questa scrittura mi sembra sbagliata... Vettore è un vettore di stringhe, ossia un puntatore a puntatore di caratteri (char** per intenderci..), un generico vettore[i] è una stringa (ossia un char*) e tu lo inizializzi come carattere '\0' (un semplice char)... Di sicuro questo è sbagliato, non ti genera neanche un warning?

Loading