Vergleicht Zeichen-Arrays und Stringliterale in C ++
-
08-07-2019 - |
Frage
Ich habe ein Zeichen-Array, und ich versuche, herauszufinden, ob es sich um ein Zeichenfolgenliteral, zum Beispiel entspricht:
char value[] = "yes";
if(value == "yes") {
// code block
} else {
// code block
}
Dies führte zu dem folgenden Fehler: Vergleich mit Stringliteral führt zu undefiniertem Verhalten. Ich habe auch versucht, so etwas wie:
char value[] = "yes";
if(strcmp(value, "yes")) {
// code block
} else {
// code block
}
Dies brachte keine Compiler-Fehler, aber es verhält sich nicht wie erwartet.
Lösung
std::strcmp
0 zurück, wenn Strings gleich sind.
Andere Tipps
Überprüfen Sie die Dokumentation für strcmp. . Hinweis: es ist kein boolean Wert zurück
ETA: ==
funktioniert nicht im Allgemeinen, weil cstr1 == cstr2
vergleicht Zeiger , so dass ein Vergleich nur wahr ist, wenn cstr1
und cstr2
auf den gleichen Speicherplatz, auch wenn sie beide vorkommen beziehen sich auf Strings, die lexikographisch gleich sind. Was Du versuchen (eine cstring zu einem wörtlichen Vergleich, zum Beispiel cstr == "yes"
) insbesondere wird nicht funktionieren, weil der Standard es nicht erforderlich zu. In einer angemessenen Umsetzung bezweifle ich, es würde explodieren, aber cstr == "yes"
ist unwahrscheinlich, dass jemals gelingen, weil cstr
unwahrscheinlich ist, an die Adresse beziehen, die die String-Konstante "yes"
lebt.
strcmp liefert einen Tri-State-Wert, um anzuzeigen, was die relative Reihenfolge der beiden Strings sind. Wenn Sie einen Anruf wie strcmp machen (a, b), die Funktion zurück
- ein Wert <0, wenn a
- 0, wenn a == b
- ein Wert> 0, wenn a> b