[RISOLTO] Problema File e Allocazione Dinamica

di Anonimizzato12962 il
7 risposte
Salve a tutti, ho un problema con questo programma riguardante allocazione dinamica e file.
Il programma dovrebbe leggere da un file di input “stringhe.txt” 2 stringhe e
(attravero length e la funzione malloc o calloc) allocare lo spazio minimo necessario per poter
contenere la loro concatenazione.
Io ho scritto:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void lenght(char x[],int*n);

int main()
{
char *string = NULL;
char bozza[100];
int count=0;

FILE *input = NULL;
input = fopen("stringhe.txt","r");
while(fscanf(input,"%s",&bozza) == 1)
{
lenght(bozza,&count);
}
string=(char*)malloc(count*sizeof(char));
printf("%d",count);
return 0;
}

void lenght(char x[],int*n)
{
int i;

for(i=0;;i++)
{
if(x!='\0')
{
*n=*n++;
}
else break;
}
}

Ho aggiunto una printf per controllare che la variabile count si aggiorni correttamente in base alle stringhe in input, ma purtroppo mi rimane a 0!
Il file stringhe.txt l'ho salvato nella stessa cartella del programma ed è costituito da due parole separate da uno spazio.
Qualcuno sa dirmi dov'è l'errore?

7 Risposte

  • Ciao, onestamente non ho capito come dovrebbe funzionare lenght...
    Se ho capito bene tu vuoi che ad ogni iterazione del while quella funzione calcoli la lunghezza della stringa letta ( la variabile bozza) e aggiorni il valore della variabile count giusto?
    In tal caso, come mai non provi una soluzione di questo tipo?
    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main()
    {
    char *string,bozza[100];
    int count;
    FILE *input;
    input = fopen("/home/sergio/file","r");
    if(input==NULL)
        {
        printf("Errore apertura file!\n");
        exit(1);
        }
    count=0;
    while((fscanf(input,"%s",bozza))==1)
        {
        printf("%s   lunghezza parola:%d\n",bozza,strlen(bozza));
        count+=strlen(bozza);
        }
    count++;    //incremento count di 1 per inserire il \0 finale
    string=malloc(count*sizeof(char));
    if(string==NULL)
        {
        printf("Impossibile allocare la stringa...\n");
        exit(1);
        }
    printf("%d",count);
    return 0;
    }

    EDIT:
    Ho provato a scrivere anche io una funzione simile alla tua, così non ho cambiato troppo il codice:
    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    void lung(char string[],int *n);
    
    int main()
    {
    char *string,bozza[100];
    int count,somma;
    FILE *input;
    input = fopen("/home/sergio/file","r");
    if(input==NULL)
        {
        printf("Errore apertura file!\n");
        exit(1);
        }
    somma=count=0;
    while((fscanf(input,"%s",bozza))==1)
        {
        lung(bozza,&count);
        printf("%s   lunghezza parola:%d\n",bozza,count);
        somma+=count;
        }
    somma++;    //incremento somma di 1 per inserire il \0 finale
    string=malloc(count*sizeof(char));
    if(string==NULL)
        {
        printf("Impossibile allocare la stringa...\n");
        exit(1);
        }
    printf("%d",somma);
    return 0;
    }
    
    
    void lung(char string[],int *n)
    {
    int i=0;
    while(string && *string++)
    	{
        i++;
    	}
    *n=i;
    }
    
  • Con il tuo Edit hai risolto i miei ultimi dubbi, grazie infinite!
    TI voglio chiedere solo un'ultima cosa, l'inizializzazione di char bozza[100] è fondamentale per il prosieguo? Un vettore char quando viene dichiarato non viene inizializzato a zero?
  • Figurati, finché si può
    ( Prossima volta ricordati di inserire il codice tra la tag
     [code]
    [/code] così non perde l'indentazione)
    No, appena dichiarato dovrebbe contenere dei valori random, come per gli array contenenti numeri, però non ho capito la prima domanda...
    In che senso fondamentale per il prosieguo?
  • Ok|
    Fondamentale nel senso che se non si effettua, il programma non è in grado di contare la lunghezza del vettore perchè non inizializzato! Non so se mi sono spiegato
  • Beh non credo sia un problema perché tanto poi dentro bozza ci ritrovi le varie stringhe lette con la fscanf ad ogni iterazione del while, quindi non serve inizializzarla credo e a me sembra funzionare correttamente così infatti...
  • Stupido, avevo sbagliato l'assegnamento del puntatore!

    Errori da dilettante
    Ti ringrazio tantissimo per la tua pazienza

  • Di niente, buon lavoro ( e buona fortuna) col C
Devi accedere o registrarti per scrivere nel forum
7 risposte