2015-12-27 14 views
6

Non riesco a capire qual è il problema con il mio codice. Qui è il mio codice:Come utilizzare correttamente fget in una struttura?

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

#define N 20 

typedef struct _dog { 
    char dogName[N],ownerName[N]; 
    int dogAge; 
} Dog; 

int main() { 
    //Dynamic array 
    int size; 
    printf("Number of dogs: "); 
    scanf("%d", &size); 
    Dog *dog = (Dog*)malloc(sizeof(Dog)*size); 
    printf("\n"); 
    //Input 
    int i; 
    printf("Please provide the data: [dogName][ownerName][dogAge] :\n"); 
    for(i=0;i<size;i++) { 
     fgets(dog[i].dogName, sizeof(dog[i].dogName), stdin); 
     fgets(dog[i].ownerName, sizeof(dog[i].ownerName), stdin); 
     scanf("%d", &dog[i].dogAge); 
    } 
    //Output 
    printf("\nYou provided the following data:\n"); 
    for(i=0;i<size;i++) { 
     printf("Dog Name: %s\nOwner Name: %s\nDog Age: %d\n", dog[i].dogName, dog[i].ownerName, dog[i].dogAge); 
    } 

    free(dog); 
    return 0; 
} 

il compito è abbastanza facile, è necessario fare un database ma i cani e proprietari possono avere due o più nomi, è per questo che cerco di usare fget. Ma l'uscita sembra terribile: (E la prima parte del nome del cane di solito è vuota)

You provided the following data: 
Dog Name: 

Owner Name: Doggy 1 

Dog Age: 0 
Dog Name: Big Dick 

Owner Name: 2 

Dog Age: 0 

ho letto this ma non mi ha aiutato.

L'input che ho usato:

Doggy 1 
Big Dick 
2 
Doggy 2 

Si è conclusa dopo Doggy 2.

+1

[Si prega di vedere questa discussione sul perché non trasmettere il valore restituito di 'malloc()' e famiglia in 'C'.] (Http://stackoverflow.com/q/605845/2173917). –

+0

Puoi mostrare il tuo contributo, per favore? – Downvoter

+0

@cad Aggiunto! Ma sembra che abbiamo trovato il problema principale. – 2b1c

risposta

11

State lasciando un ritorno a capo dal tuo ultimo scanf() che è una valida ingresso per il fgets(). Modificare

scanf("%d", &size); 

a

scanf("%d%*c", &size); 

a consumare e scartare la fine riga a causa della pressione di INVIO tasto dopo aver inserito il numero di cani.

Lo stesso vale per la scansione variabile dogAge anche all'interno di lop.

correlate, citando lo standard C11, capitolo §7.21.6.2, fscanf()

Trailing spazi bianchi (tra cui caratteri di nuova riga) viene lasciato non letto se non accompagnata da una direttiva . [...]

così, il newline ('\n'), il spazi bianchi, viene lasciato non letto nel buffer di input.

+0

Grazie per la rapida risposta.Ho aggiunto il codice nella parte della dimensione, ma sembra che ho ancora un bug nel mio codice nel ciclo in cui utilizzo scanf. Se capisco che lo scanf nel loop crea anche una nuova riga? AGGIORNAMENTO: Ho aggiunto% d% * c allo scanf nel ciclo, ora funziona come un incantesimo. :) C'è un modo migliore per consumare i newline dopo scanf o devo usarlo tutto il tempo? – 2b1c

+0

@ M.Carver la mia risposta funziona. L'ho provato – Elyasin

+0

@SouravGhosh L'ho downsato. Senza offesa per favore, ma l'ho provato e non funziona. Per te funziona? – Elyasin

3

Aggiungere un getchar() dopo le chiamate scanf(...).

Come nelle altre risposte citate. scanf utilizza i caratteri riconosciuti in base al formato, ma lascia la nuova riga \n in stdin. Con getchar lo si consuma e le letture successive da stdin non devono essere confuse con .

+0

@Elyasin Se aggiungo getchar(); dopo i due scanf funziona anche, grazie per l'aiuto. Ragazzi, rock! – 2b1c

Problemi correlati