2015-12-27 16 views
6

Ich kann nicht herausfinden, was das Problem mit meinem Code ist. Hier ist mein Code:Wie verwendet man Fgets in einer Struktur?

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

Die Aufgabe ist ziemlich einfach, müssen Sie eine Datenbank machen, aber die Hunde und Besitzer von zwei oder mehr Namen haben kann, ist also, warum ich versuche fget zu verwenden. Aber der Ausgang sieht schrecklich: (Und der erste Hundenamensteil ist in der Regel leer)

You provided the following data: 
Dog Name: 

Owner Name: Doggy 1 

Dog Age: 0 
Dog Name: Big Dick 

Owner Name: 2 

Dog Age: 0 

Ich habe this gelesen, aber hat mir nicht geholfen.

Der Eingang I verwendet:

Doggy 1 
Big Dick 
2 
Doggy 2 

Es beendet ist, nachdem Doggy 2.

+1

[Bitte lesen Sie diese Diskussion darüber, warum nicht der Rückgabewert von 'malloc()' und Familie in 'C' umgewandelt werden soll. (Http://stackoverflow.com/q/605845/2173917). –

+0

Können Sie bitte Ihre Eingabe zeigen? – Downvoter

+0

@cad Hinzugefügt! Aber es scheint, wir haben das Hauptproblem gefunden. – 2b1c

Antwort

11

Sie eine neue Zeile aus Ihrem letzten scanf() verlassen, die ein gültig Eingang für den fgets() ist. Ändern

scanf("%d", &size); 

zu

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

zu verbrauchen und wegwerfen die hinteren Newline durch die Presse von ENTER Taste, nachdem die Anzahl der Hunde eingeben.

Das gleiche gilt für die Variable dogAge Scannen auch innerhalb der Lop.

Verwandte, unter Angabe der C11 Standard, Kapitel §7.21.6.2, fscanf()

abschließenden Leerzeichen (einschließlich new-line Zeichen) wird ungelesen gelassen, es sei denn durch eine Richtlinie abgestimmt. [...]

so die newline ('\n'), wird die nachlauf Leerraum, in dem Eingangspuffer ungelesene gelassen.

+0

Vielen Dank für die schnelle Antwort.Ich habe den Code in der Größe Teil hinzugefügt, aber es scheint, ich habe immer noch einen Fehler in meinem Code in der Schleife, wo ich scanf. Wenn ich richtig verstehe, erzeugt das scanf in der Schleife auch eine neue Zeile? UPDATE: Ich habe% d% * c bei der scanf in der Schleife hinzugefügt, funktioniert jetzt wie ein Charme. :) Gibt es eine bessere Möglichkeit, neue Zeilen nach scanf zu konsumieren, oder muss ich diese immer verwenden? – 2b1c

+0

@ M.Carver meine Antwort funktioniert. Ich habe es getestet. – Elyasin

+0

@SouravGhosh Ich habe es abgelehnt. Nichts für ungut bitte, aber ich habe es getestet und es funktioniert nicht. Funktioniert es für Sie? – Elyasin

3

Fügen Sie eine getchar() nach der scanf(...) Anrufe.

Wie in den anderen Antwort (en) erwähnt. scanf verbraucht die erkannten Zeichen entsprechend dem Format, aber übergibt den Zeilenumbruch \n in stdin. Mit getchar verbrauchen Sie es und nachfolgende liest von stdin sollte nicht verwirrt werden.

+0

@Elyasin Wenn ich getchar() hinzufügen; nach den zwei scanf klappt es auch, danke für die hilfe. Ihr Jungs rockt! – 2b1c

Verwandte Themen