Vergleich zwischen Stringliteral
-
20-09-2019 - |
Frage
Dieses sehr einfache Code:
#include <iostream>
using namespace std;
void exec(char* option)
{
cout << "option is " << option << endl;
if (option == "foo")
cout << "option foo";
else if (option == "bar")
cout << "opzion bar";
else
cout << "???";
cout << endl;
}
int main()
{
char opt[] = "foo";
exec(opt);
return 0;
}
erzeugen zwei Warnung:. Vergleich mit Stringliteral Ergebnisse in nicht näher bezeichnete Verhalten
Können Sie erklären, warum genau dieser Code nicht funktioniert, aber wenn ich ändern
char opt[]
char *opt
es funktioniert, aber erzeugt die Warnung? Ist es in das Verzeichnis \ 0 Kündigung zu tun? Was ist der Unterschied zwischen den beiden Erklärung opt? Was passiert, wenn ich const Qualifier benutzen? Die Lösung ist die Verwendung std :: string?
Lösung
char-Arrays oder char-Pointer sind nicht wirklich die gleiche wie String-Klasse Objekte in C ++, so diesen
if (option == "foo")
Enthält die Zeichenfolge option
zum Stringliteral „foo“ nicht vergleichen, vergleicht er die Adresse von option
mit der Adresse des Stringliteral „foo“. Sie müssen eine der vielen String-Vergleichsfunktionen verwenden, wenn Sie wissen wollen, ob die Option das gleiche wie „foo“ ist. strcmp
ist die offensichtliche Art und Weise, dies zu tun, oder Sie können std::string
statt char*
verwenden
Andere Tipps
Sie können ==
Operator verwenden Zeichenfolgen zu vergleichen, nur wenn Sie std::string
verwenden (was eine gute Praxis ist). Wenn Sie C-Stil char * / char [] Strings, müssen Sie C-Funktionen verwenden strcmp
oder strncmp
.
Sie können auch die std::string::operator ==
verwenden std::string
mit einem C-String zu vergleichen:
std string foo = "foo";
const char *bar = "bar";
if (foo == bar)
...
Der Grund, warum es nicht funktioniert, weil der Vergleich Saiten nicht zu vergleichen ist, sondern Zeichenzeiger.
Der Grund, warum es können Arbeit, wenn Sie char *, weil der Compiler die Zeichenkette „opt“ einmal zu speichern, kann beschließen, und wiederverwenden es für beide Referenzen (ich bin sicher, ich habe einen gesehen Compiler-Einstellung irgendwo, der angibt, ob der Compiler dies der Fall ist).
Im Fall von char opt [], der Compiler kopieren die Stringliteral in den Speicherbereich für das Opt-Array reserviert (wahrscheinlich auf dem Stapel), die die Zeiger verursacht, anders zu sein.
Renze
Sieht aus wie Sie kamen aus Java / C # :) In C ++ String ist nur ein Zeiger auf Speicher, in dem Zeichen gespeichert ist, und mit Null-Zeichen am Ende. Wenn Strings „Look“ gleich können sie auf verschiedene Bereiche im Speicher zeigen und nicht gleich sein. zur Überprüfung Gleichheit entweder Verwendung von C ++ s Klasse std :: string oder C-Funktion strcmp.
Für C ++ Ich würde die std :: string Lösung :
#include <iostream>
#include <string>
using namespace std;
void exec(string option)
{
cout << "option is " << option << endl;
if (option == "foo")
cout << "option foo";
else if (option == "bar")
cout << "option bar";
else
cout << "???";
cout << endl;
}
int main()
{
string opt = "foo";
exec(opt);
exec("bar");
char array[] = "other";
exec(array);
return 0;
}
std :: string weiß, wie sich der char erstellen out [], char *, etc, so dass Sie immer noch die Funktion auf diese Weise aufrufen können, auch.