Vergleichen von vom Benutzer eingegebenen Zeichen in C

Lesezeit: 3 Minuten

Benutzer-Avatar
Joe Scho

Die folgenden Codeausschnitte stammen aus einem C-Programm.

Der Benutzer gibt Y oder N ein.

char *answer="\0";

scanf (" %c", answer);

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

Ich kann nicht herausfinden, warum das so ist if Anweisung wird nicht als wahr ausgewertet.

Ich habe mit a nach der y- oder n-Eingabe gesucht printf und es ist da, also weiß ich, dass ich die Benutzereingabe erhalte. Auch wenn ich die Bedingung der if-Anweisung durch 1 ersetze (was sie wahr macht), wird sie richtig ausgewertet.

Benutzer-Avatar
codaddict

Ich sehe zwei Probleme:

Der Zeiger answer ist ein null Zeiger und Sie versuchen, ihn zu dereferenzieren scanfDies führt zu undefiniertes Verhalten.

Du brauchst kein char Zeiger hier. Sie können einfach eine verwenden char variabel als:

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

Weiter, um zu sehen, ob das gelesene Zeichen ist 'y' oder 'Y' du solltest tun:

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

Wenn du Ja wirklich müssen Sie einen Zeichenzeiger verwenden, können Sie Folgendes tun:

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

  • Warum ist es notwendig, in scanf ein Leerzeichen vor %c zu setzen? Bei mir funktioniert es nicht, wenn ich das Leerzeichen vor %c in scanf entferne.

    – Ahnung

    11. August 2015 um 13:50 Uhr

  • @hunch Aus der Manpage (scanf (3): [… for type modifier character “c”…] Das übliche Überspringen von führenden Leerzeichen wird unterdrückt. Um zunächst Leerzeichen zu überspringen, verwenden Sie ein explizites Leerzeichen im Format. […] Ich gehe davon aus, dass in Ihrem Eingabestream einige Leerzeichen übrig sind, die beim Zugriff auf den Stream herausspringen, wodurch Ihr Scanf “übersprungen” wird. Denke das hast du schon herausgefunden…

    – Haini

    9. Januar 2016 um 17:16 Uhr

Benutzer-Avatar
Markus Elliot

answer sollte kein Zeiger sein, die Absicht ist offensichtlich, ein Zeichen zu halten. scanf übernimmt die Adresse dieses Zeichens, also sollte es als aufgerufen werden

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

Als nächstes wird Ihre “oder”-Anweisung falsch gebildet.

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

Was Sie ursprünglich geschrieben haben, fordert zum Vergleich auf answer mit dem Ergebnis von 'Y' || 'y'was ich vermute, ist nicht ganz das, was Sie tun wollten.

  • Ich habe es geändert, aber aus irgendeinem Grund wird der Körper der if-Anweisung immer noch nicht ausgewertet

    – Joe Scho

    12. Oktober 2010 um 4:21 Uhr

  • @Joe, hatte einen leichten Tippfehler mit einem zusätzlichen Klammer, wenn Sie meine Antwort kopiert und eingefügt hätten, wäre es wahrscheinlich fehlgeschlagen.

    – Markus Elliot

    12. Oktober 2010 um 4:22 Uhr

Benutzer-Avatar
paxdiablo

Zunächst einmal Ihre answer Variable sollte vom Typ sein charnicht char*.

Wie für die if Aussage:

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

Dies ist eine erste Bewertung 'Y' || 'y' was in der Booleschen Logik (und für ASCII) wahr ist, da beide “wahr” (ungleich Null) sind. Mit anderen Worten, Sie würden nur die bekommen if Anweisung zu feuern, wenn Sie irgendwie eingetreten wären STRGEIN (wieder für ASCII, und wo ein wahrer Wert 1 entspricht)*a.

Du könnte Verwenden Sie das Richtigere:

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

aber Sie sollten wirklich verwenden:

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

da dies der tragbarere Weg ist, um dasselbe Ziel zu erreichen.


*a Sie fragen sich vielleicht, warum ich alle möglichen Bedingungen für meine Aussagen einsetze. Während die überwiegende Mehrheit der C-Implementierungen ASCII und bestimmte bekannte Werte verwendet, wird dies nicht unbedingt von den ISO-Standards vorgeschrieben. Ich weiß mit Sicherheit, dass mindestens ein Compiler immer noch EBCDIC verwendet, daher mache ich nicht gerne ungerechtfertigte Annahmen.

Benutzer-Avatar
Hobbs

Denn Vergleichen funktioniert so nicht. 'Y' || 'y' ist ein logischer Oder-Operator; es kehrt zurück 1 (wahr), wenn eines seiner Argumente wahr ist. Seit 'Y' und 'y' sind beide wahr, du vergleichst *answer mit 1.

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 */
}

1019750cookie-checkVergleichen von vom Benutzer eingegebenen Zeichen in C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy