Ciclo do while e lettura array dinamico

di il
13 risposte

Ciclo do while e lettura array dinamico

Ciao a tutti, ho un problema che mi sembra molto strano. Ho scritto questo codice
 #include <stdio.h>
#include <stdlib.h>

int main()
{
    char risp1, risp2;
    char animale[20];
    FILE* animali = fopen("animals.txt", "a");

    do {
        printf("Aggiornare lista animali? ");
        scanf("%c", &risp1);
        if(risp1=='s') {
            printf("Inserire animale: ");
            scanf("%s", animale);
            fprintf(animali, "%s\n", animale);
        }
    } while (risp1=='s');

    return 0;
}
che dovrebbe essere banale ma non mi funziona. In realtà funziona la prima volta, poi chiede se vuoi aggiornare la lista degli animali ed esce subito senza aspettare la seconda risposta. Qualcuno sa perchè? Grazie!

13 Risposte

  • Re: Ciclo do while e lettura array dinamico

    Prova così
    
        do {
            printf("Aggiornare lista animali? ");
            scanf(" %c", &risp1);
            if(risp1=='s') {
                printf("Inserire animale: ");
                scanf(" %s", animale);
                fprintf(animali, "%s\n", animale);
            }
        } while (risp1=='s');
    
    fai copia/incolla del codice. Se poi ti funziona ti do le spiegazioni
  • Re: Ciclo do while e lettura array dinamico

    Dopo averlo usato chiudi il file con la fclose().
  • Re: Ciclo do while e lettura array dinamico

    skynet ha scritto:


    prova così
    
        do {
            printf("Aggiornare lista animali? ");
            scanf(" %c", &risp1);
            if(risp1=='s') {
                printf("Inserire animale: ");
                scanf(" %s", animale);
                fprintf(animali, "%s\n", animale);
            }
        } while (risp1=='s');
    
    fai copia/incolla del codice. Se poi ti funziona ti do le spiegazioni
    ovviamente funziona!
    ho visto che l'unica differenza è quello spazio prima di %c e %s... aspetto le spiegazioni!
    grazie.
  • Re: Ciclo do while e lettura array dinamico

    Preso dalla spiegazione di scanf
    
    Whitespace character: the function will read and ignore any whitespace characters (this includes blank spaces and the newline and tab characters) which are encountered before the next non-whitespace character. This includes any quantity of whitespace characters, or none.
    
    Praticamente scanf esclude i caratteri cosiddetti whitespace (spazio, \n, \r ecc) finche non trova altri tipi di caratteri. Siccome nel tuo input è rimasto il \n dopo l'ingresso dei primi dati questo (se non scartato) veniva letto dal successivo scanf e causava l'uscita dal ciclo.
  • Re: Ciclo do while e lettura array dinamico

    Ah, preciso come al solito!
    grazie.
  • Re: Ciclo do while e lettura array dinamico

    Ne approfitto per chiederti un'altra cosa: dopo aver scritto gli animali sul file, vorrei leggerli e memorizzarli in un array di stringhe. Ho provato con
    
            char** animals;
            int i=0;
    while (animali != EOF) {
            char line[20];
            fscanf(animali, " %s", line);
            animals[i] = malloc(20*sizeof(char));
            strcpy(animals[i], line);
            i++;
        }
    
    ma ovviamente non va...
  • Re: Ciclo do while e lettura array dinamico

    Alloca spazio per i puntatori a stringhe prima poi per le stringhe.
  • Re: Ciclo do while e lettura array dinamico

    Una cosa del genere?
    
    while (animali != EOF) {
            char line[20];
            fscanf(animali, " %s", line);
            animals = malloc(sizeof(char*));
            animals[i]=malloc(20*sizeof(char));
            strcpy(animals[i], line);
            i++;
        }
    ma non funziona neanche così... in effetti non sono molto convinto di quello che ho fatto!
  • Re: Ciclo do while e lettura array dinamico

    
    char ** aminals = NULL;
    while (animali != EOF) {
            char line[20];
            fscanf(animali, " %s", line);
            animals = realloc(animals, (i + 1) * sizeof(char*));
            animals[i]=malloc(20*sizeof(char));
            strcpy(animals[i], line);
            i++;
        }
    
  • Re: Ciclo do while e lettura array dinamico

    Mi sa che non funziona così... e poi non ho capito quel
    (i+1)*sizeof(char*)
  • Re: Ciclo do while e lettura array dinamico

    Ad ogni ciclo allochi spazio per il nuovo puntatore che punterà all'inizio della nuova stringa.
    realloc al primo colpo alloca spazio x 0+1 puntatore, al secondo per 1+1 puntatore e così via.
    Alla fine animals terrà solo i puntatori mentre animals punterano agli indirizzi che malloc da per ogni allocazione di stringa. Da un prova veloce quì funziona.
  • Re: Ciclo do while e lettura array dinamico

    Mah...a me si impalla il pc e l'hard disk comincia a lavorare... il codice è
    
    int i=0;
        char ** animals = NULL;
        while (animali != EOF) {
            char line[20];
            fscanf(animali, " %s", line);
            animals = realloc(animals, (i + 1) * sizeof(char*));
            animals[i]=malloc(20*sizeof(char));
            strcpy(animals[i], line);
            i++;
        }
    C'entra qualcosa il fatto che sono su ubuntu?
    edit: ho provato su XP ma non cambia niente.
  • Re: Ciclo do while e lettura array dinamico

    Così funziona!
    char ** animals = NULL;
        char line[20];
        while ((result=fscanf(animali, "%s", line)) != EOF) {
            printf("%s  ", line);
            animals = realloc(animals, (i + 1) * sizeof(char*));
            animals[i]=malloc(20*sizeof(char));
            strcpy(animals[i], line);
            i++;
        }
    evidentemente era sbagliato scrivere
    while(animali!=EOF)
Devi accedere o registrarti per scrivere nel forum
13 risposte