Ciclo do while e lettura array dinamico

di Anonimizzato7887 il
13 risposte
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

  • 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
  • Dopo averlo usato chiudi il file con la fclose().
  • 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.
  • 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.
  • Ah, preciso come al solito!
    grazie.
  • 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...
  • Alloca spazio per i puntatori a stringhe prima poi per le stringhe.
  • 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!
  • 
    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++;
        }
    
  • Mi sa che non funziona così... e poi non ho capito quel
    (i+1)*sizeof(char*)
  • 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.
  • 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.
  • 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