2010-10-12 15 views
15

Die folgenden Code-Snippets stammen aus einem C-Programm.Vergleichen der vom Benutzer eingegebenen Zeichen in C

Der Benutzer gibt Y oder N.

char *answer = '\0'; 

scanf (" %c", answer); 

if (*answer == ('Y' || 'y')) 
    // do work 

ich kann nicht herausfinden, warum diese if Aussage nicht wahr wertet.

Ich überprüft für die y oder n Eingabe mit einem printf und es ist da, damit ich weiß, dass ich die Benutzereingabe bekomme. Auch wenn ich die Bedingung der if-Anweisung durch 1 ersetze (was es wahr macht), wird es richtig ausgewertet.

Antwort

22

ich zwei Probleme sehen:

Der Zeiger answer ist ein null Zeiger und Sie versuchen, es in scanf dereferenzieren, führt dies zu undefined Verhalten.

Sie benötigen hier keinen Zeiger char. Sie können nur eine char Variable als verwenden:

char answer; 
scanf(" %c",&answer); 

Weiter zu sehen, ob das gelesene Zeichen 'y' oder 'Y' ist, sollten Sie tun:

if(answer == 'y' || answer == 'Y') { 
    // user entered y or Y. 
} 

Wenn Sie wirklich einen char Zeiger verwenden müssen Sie kann etwas tun wie:

char var; 
char *answer = &var; // make answer point to char variable var. 
scanf (" %c", answer); 
if(*answer == 'y' || *answer == 'Y') { 
+1

.. oder durch den Aufruf 'malloc()' – Arun

+0

@ArunSaha: yeah, oder es auf eine lokale char Variable zeigen. – codaddict

+0

Warum muss ein Leerzeichen vor% c in scanf eingefügt werden? für mich funktioniert es nicht, wenn ich das Leerzeichen vor% c in scanf entferne. – hunch

9

answer sollte kein Zeiger sein, die Absicht ist offensichtlich, ein Zeichen zu halten. scanf die Adresse dieses Charakters nimmt, so sollte es als

char answer; 
scanf(" %c", &answer); 

Als nächstes Ihre „oder“ Anweisung gebildet falsch bezeichnet werden.

if (answer == 'Y' || answer == 'y') 

Was ursprünglich geschrieben fragt answer mit dem Ergebnis der 'Y' || 'y' zu vergleichen, was ich vermute, ich ist nicht ganz das, was Sie tun wollte.

+0

Ich habe es geändert, aber aus irgendeinem Grund der Körper der If-Anweisung ist noch nicht bewertet –

+0

@Joe, hatte einen leichten Tippfehler mit einem zusätzlichen paren, wenn Sie kopiert und eingefügt von meiner Antwort wäre es wahrscheinlich gescheitert. –

+0

yeah ich fing den Tippfehler, danke –

5

Weil Vergleich nicht so funktioniert. 'Y' || 'y' ist eine logische oder Operator; Es gibt 1 (true) zurück, wenn eines der Argumente zutrifft. Da 'Y' und 'y' beide wahr sind, sind Sie *answer mit 1.

Vergleich Was Sie wollen, ist if(*answer == 'Y' || *answer == 'y') oder vielleicht:

switch (*answer) { 
    case 'Y': 
    case 'y': 
    /* Code for Y */ 
    break; 
    default: 
    /* Code for anything else */ 
} 
5

Für einen Anfang, Ihr answer va riable sollte vom Typ char sein, nicht char*.

Was die if Aussage:

if (answer == ('Y' || 'y')) 

Diese erste 'Y' || 'y' auswertet, die in der Booleschen Logik (und für ASCII) wahr ist, da beide von ihnen sind "true" (Nicht-Null).Mit anderen Worten, würde man nur bekommt die if Aussage zu feuern, wenn Sie irgendwie CTRL eingegeben würdenA (wieder für ASCII, und wo eine echte Wert entspricht 1) * a.

Sie könnte verwenden, um die korrektere:

if ((answer == 'Y') || (answer == 'y')) 

aber Sie sollten wirklich sein mit:

if (toupper(answer) == 'Y') 

da, dass die mehr tragbar Weg, um das gleiche Ziel zu erreichen.


* a Sie werden sich vielleicht fragen, warum ich in allen möglichen conditionals für meine Aussagen bin setzen. Während die überwiegende Mehrheit der C-Implementierungen ASCII und bestimmte bekannte Werte verwendet, ist dies nicht unbedingt von den ISO-Standards vorgeschrieben. Ich weiß in der Tat, dass mindestens ein Compiler immer noch EBCDIC verwendet, daher mag ich es nicht, unberechtigte Annahmen zu machen.

Verwandte Themen