2016-08-22 3 views
-4

Wenn ich diesen Code ausführen:fgets nicht die Speicherung der gelieferten Eingaben in den Zielvariablen

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

int main() 
{ 
    char name , age , gender , male; 

    printf("Please enter your name \n"); 

    fgets(name, 20 ,stdin); 

    printf("Please enter your age \n"); 

    fgets(age , 2 , stdin); 

    printf("Please enter your gender \n"); 

    fgets(gender , 7 , stdin); 

    atoi(age); 

    { 
     if (age < 50 && gender == male) 

      printf(" You're fit to play\n Welcome player ,%s \n",name); 

      else printf("Sorry , %s. You're not fit to play", name); 

    } 
    return 0; 
} 

ich diese Ausgabe:

please enter your name 
please enter your age 
please enter your gender 
you're fit to play 
welcome player, (null) 

Und das sind die Warnungen i vom Compiler bekommen in meinem Codeblöcke:

||=== Build: Release in justexploring1 (compiler: GNU GCC Compiler) ===| 
D:\Project\C language\justexploring1\main.c||In function `main':| 
D:\Project\C language\justexploring1\main.c|8|warning: passing arg 1 of `fgets' makes pointer from integer without a cast| 
D:\Project\C language\justexploring1\main.c|10|warning: passing arg 1 of `fgets' makes pointer from integer without a cast| 
D:\Project\C language\justexploring1\main.c|12|warning: passing arg 1 of `fgets' makes pointer from integer without a cast| 
D:\Project\C language\justexploring1\main.c|13|warning: passing arg 1 of `atoi' makes pointer from integer without a cast| 
D:\Project\C language\justexploring1\main.c|16|warning: format argument is not a pointer (arg 2)| 
D:\Project\C language\justexploring1\main.c|17|warning: format argument is not a pointer (arg 2)| 
D:\Project\C language\justexploring1\main.c|6|warning: 'name' might be used uninitialized in this function| 
D:\Project\C language\justexploring1\main.c|6|warning: 'age' might be used uninitialized in this function| 
D:\Project\C language\justexploring1\main.c|6|warning: 'gender' might be used uninitialized in this function| 
D:\Project\C language\justexploring1\main.c|6|warning: 'male' might be used uninitialized in this function| 
||=== Build finished: 0 error(s), 10 warning(s) (0 minute(s), 0 second(s)) ===| 

Es ignoriert völlig fgets und fordert nicht für jede Eingabe. behandelt immer wenn Aussage als wahr. und verwendet immer (Null) für name.

Können Sie mir bitte sagen, was mit meinem Code nicht stimmt? Ich wurde einmal aufgefordert, fgets anstelle von scanf und gets zu verwenden. ist es erwähnenswert, dass scanf gab mir auch ähnliche Probleme.

+4

Tun Sie sich einen Gefallen: ** Schalten Sie alle Compiler-Warnungen ein und beachten Sie sie **. – pmg

+0

Ich habe der Frage nur Compiler-Warnungen hinzugefügt. Es gibt eine ganze Reihe von ihnen. –

+0

strcmp? Ich kenne diese Funktion nicht. Kannst du mir zeigen, wie es benutzt wird? –

Antwort

2

in Ihrem Code name, age, gender, male alle sind char Variablen, nicht char Array. Sie benötigen ein Array, um das zu erreichen, auf das Sie ausgerichtet sind. Ihre Arrays müssen von derselben Größe sein wie die, die Sie an fgets() übergeben.

Das heißt,

  • atoi() konvertiert nicht die mitgelieferte Schnur selbst zu int, es gibt den konvertierten Wert. Sie müssen das in einer Variablen speichern.
  • male ist ein Variable, keine Stringliteral, so der Name der Variablen nicht als Wert zum Vergleich herangezogen werden kann. Sie können entweder eine Variable mit dem String-Literal const char * match = "male"; definieren oder direkt das String-Literal selbst ("male") zum Vergleich verwenden.
  • Sie müssen strcmp() sowieso für den Vergleich von Zeichenfolgen verwenden.
+0

Also, wie konvertiere ich den Wert in Integer? Oder wie fordere ich eine Ganzzahl? –

+0

@AllanMayers Sie können den Rückgabewert von 'atoi()' in eine 'int'-Variable speichern, wenn Sie möchten. –

+0

@AllanMayers Hier ist eine [Demo] (http://ideone.com/RKL2VT), die für Sie arbeiten sollte. Ich denke nicht, dass es richtig ist, gegen das Geschlecht zu diskriminieren, aber gegen Leute, die keine Pfannkuchen mögen ... auf jeden Fall :-) (Schau dir die Demo an, wenn du nicht verstehst, was ich dort meinte)! Es sollte jedoch leicht sein, zurück zu wechseln. Ich hoffe das hilft dir! – iRove

Verwandte Themen