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

    Inizializzare vettore di stringhe

    codice:
    #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:
    codice:
    prova
    asd
    lol
    quarta
    E questo è l'output:
    codice:
    prova
    asd
    lol
    quarta
    quarta
    quarta
    quarta
    quarta
    Premere un tasto per continuare . . .
    Come vedete, non mi inizializza il vettore correttamente... Dove sbaglio?

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Moderazione

    Il linguaggio va obbligatoriamente indicato nel titolo, come richiesto dal Regolamento interno.

    Lo aggiungo io.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Si scusa, una dimenticanza

  4. #4
    Prova a fare questo

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

  5. #5
    Originariamente inviato da _Alfabetagamma_
    Prova a fare questo

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

    codice:
    quarta
    quarta
    quarta
    Premere un tasto per continuare . . .

  6. #6
    Ho messo due printf nella funzione e... funziona XD

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

    codice:
    #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;   
    }

  7. #7
    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... :/

  8. #8
    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.

  9. #9
    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.

  10. #10
    Mi inserisco anche io con qualche riflessione:

    codice:
    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?
    Salute a voi, da Laikius!

    --> Faber est suae quisque fortunae <--

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.