
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.

codaddict
Ich sehe zwei Probleme:
Der Zeiger answer
ist ein null
Zeiger und Sie versuchen, ihn zu dereferenzieren scanf
Dies 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') {

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.

paxdiablo
Zunächst einmal Ihre answer
Variable sollte vom Typ sein char
nicht 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.

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 */
}
10197500cookie-checkVergleichen von vom Benutzer eingegebenen Zeichen in Cyes