2017-06-23 2 views
1

ich meinen Grunde C bin Überarbeitung für das kommende Quiz vorzubereiten, als ich eine Funktion des Schreiben eine Zeicheneingabe einfach zu nehmen und es in eine Struktur zu speichern und wieder ausdrucken. Es gibt kein Problem mit dem Kompilieren, aber ich habe logisches Problem bekommen. Wie behebe ich das?Logical Ausgabe mit printf und scanf

#include <stdio.h> 

struct player 
{ 
    char letter; 
    int age; 
    double avg; 
}; 

int main() 
{ 
    struct player P1; 
    char name; 
    int age; 
    double avg; 
    printf("Enter age: "); 
    scanf("%d", &age); 
    printf("Enter avg: "); 
    scanf("%lf", &avg); 
    printf("Enter name: "); 
    scanf("%s", &name); 

    P1.letter= name; 
    P1.avg = avg; 
    P1.age = age; 
    printf("\n Age is: %d \n", P1.age); 
    printf("Avg is: %lf", P1.avg); 
    printf(" \n Name is: %c \n", P1.letter); 
    return 0; 
} 

Wenn ich für int in '1' setzen, Ausgang wäre „Alter ist:.. 0'

+0

'scanf ("% s", &name);' => 'scanf ("% c", &name);' ' – Stargateur

+2

scanf (“ % s ", &name);' - Sie sollten [die Anforderungen des Formatbezeichners '% s' lesen.] (http://en.cppreference.com/w/c/io/fscanf). Sie geben keinen angemessenen Betrag an Platz für einen Namen Zeichenfolge zu lesen. – WhozCraig

+0

guter alter Buffer overrun! nie in einen C-String mit einer unbekannten Länge schreiben. nie. –

Antwort

0

Sie versuchen, Namen, Alter und avg bekommen von dem Spieler so zu speichern, Name, Sie sollten ein Array nicht als Zeichen deklarieren und den Namen der Strukturvariable use strcpy() zuweisen (direkte Zuweisung funktioniert nicht) ODER wenn Sie nur ein einzelnes Zeichen als Namen verwenden, dann schreiben Sie scan wie folgt:

scanf("%c", &name); 

Check Code unten, wird es Ihnen helfen

#include <stdio.h> 

struct player 
{ 
    char letter[10]; 
    int age; 
    double avg; 
}; 

int main() 
{ 
    struct player P1; 
    char name[10]; 
    int age; 
    double avg; 
    printf("Enter age: "); 
    scanf("%d", &age); 
    printf("Enter avg: "); 
    scanf("%lf", &avg); 
    printf("Enter name: "); 
    scanf("%s", &name); 

    strcpy(P1.letter,name); 
    P1.avg = avg; 
    P1.age = age; 
    printf("\n Age is: %d \n", P1.age); 
    printf("Avg is: %lf", P1.avg); 
    printf(" \n Name is: %s \n", P1.letter); 
    return 0; 
} 
+0

Bitte zeigen Sie keinen Pufferüberlauf Code in den Antworten . Das '% s' benötigt eine Feldbreite,'% 9s' in diesem Fall - und warum hat so ein * winziger * Puffer überhaupt? –

+0

hast du diesen Code ausgeführt .. ?? es funktioniert für mich.check Erklärung, wenn Sie möchten, speichern Sie den Namen des Spielers dann sollten Sie das Zeichen-Array nicht ein einziges Zeichen erfordern. – suraj

+0

Geben Sie * christopher-montgomery-joseph * als Namen ein und sehen Sie, was passiert. 'scanf ("% s ", ...)' ist ** immer ** ein Pufferüberlauf. Schreiben Sie das nie. –

0

Sie verwenden einen Zeichendatentyp für eine Zeichenfolge eingeben, „char name“, die Sie zu undefinierten Verhalten führt.

Statt dessen erklären Sie ein Zeichen-Array wie dieses „char name [10]“ und dann Namen lesen. aber während der Zuweisung müssen Sie darauf achten, dass Sie nicht direkt zuweisen können strcpy wie folgt verwenden.

strcpy (p1.letter, name) (Hier Brief ist auch Zeichen-Array)

Verwandte Themen