Die Verwendung der Gleichheits-operator == für den Vergleich von zwei strings auf Gleichheit in C
int main (int argc, **argv)
{
if (argv[1] == "-hello")
printf("True\n");
else
printf("False\n");
}
# ./myProg -Hallo False
Warum? Ich merke strcmp(argv[1], "-hello") == 0
gibt true zurück,... aber warum kann ich nicht mit dem Gleichheits-operator vergleicht zwei C-strings?
- Da Sie darauf Bestand, die Frage ist eine C-Frage, ich habe die Stelle der C++ - code mit C-code. Wenn du unbedingt auf std::cout ich bestehen Sie auf einen C++ - tag.
- Sicherlich diese Frage ist ein exaktes Duplikat.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil
argv[1]
(zum Beispiel), ist eigentlich ein Zeiger auf die Zeichenfolge. So alle Sie tun, ist der Vergleich von Zeigern.Kann man nicht vergleichen strings in C mit ==,, weil die C-compiler nicht wirklich eine Ahnung über die Saiten über ein string-literal.
Der compiler bei einem Vergleich mit einem
char*
auf beiden Seiten, so ist es nicht ein Zeiger-Vergleich (vergleicht die gespeicherten Adressen in den Zeigern)In
C
, da in den meisten Kontexten, ein array "zerfällt zu einem Zeiger auf sein erstes element".Wenn du also das array
"foobar"
und verwenden Sie es in den meisten Kontexten, es zerfällt in einen pointer:Was Sie wollen, es zu vergleichen, die Inhalt des Arrays mit etwas. Sie können dies manuell tun
oder automatisch
if(strcmp(name, "foobar"))
wird zu false ausgewertet, wenn die strings gleich sind, denn es gibt 0 zurück, in diesem Fall.if (strcmp(name, "foobar") == 0)
wäre besserWeil es keine solche Sache wie eine C-Zeichenfolge.
In C ein string ist in der Regel ein array von char ist, oder ein Zeiger auf char (das ist fast das gleiche). Vergleicht man einen Zeiger/array um ein const-array nicht die erwarteten Ergebnisse.
UPDATE: was ich mit "keine C-Zeichenfolge" ist, es gibt keine Strings in C., Was in der Regel bezeichnet als a 'C string' ist die Sprache unabhängig (als "Pascal-string" ist), es ist die Darstellung von Zeichenketten als null-terminierte lineare array von Zeichen.
char
.char
(string Literale sind, werden als arrays vonchar
in C,const char
in C++).In C, string-Werte (einschließlich string-Literale) dargestellt, die als arrays von
char
gefolgt von einem 0-terminator, und Sie können nicht die==
Betreiber zu vergleichen, array-Inhalt; die Sprache einfach nicht zu definieren, den Betrieb.Außer, wenn es ist der operand entweder die
sizeof
oder&
Betreiber, oder, wenn es ein string-literal verwendet wird, zu initialisieren ein array in einer Erklärung, die einen Ausdruck vom Typ "N-element-array von T" haben wird, dessen Typ implizit in (Karies) in den Typ "Zeiger auf T", und der Wert des Ausdrucks wird die Adresse des ersten Elements des Arrays.So, wenn Sie schreiben
der compiler implizit konvertiert den Ausdruck
"-hello"
vom Typ "7-element-array von char" zu "Zeiger auf char" (argv[1]
ist bereits ein Zeiger-Typ), und der Wert des Ausdrucks ist der Adresse der Charakter'-'
. Also, was==
wind-up-Vergleich sind zwei Zeiger Werte, die (wahrscheinlich) nie gleich sein, da"-hello"
undargv[1]
(wahrscheinlich) besetzen unterschiedliche Regionen im Speicher.Deshalb Sie haben die Verwendung von Bibliothek-Funktionen wie
strcmp()
zum vergleichen von string-Werten.char
was sind einen 0-terminator ...Da C-strings dont als solche existieren. Sie sind char-arrays endet in einem
\0
.Den Gleichheitsoperator
==
testen, dass der Zeiger auf das erste element des array gleich sind. Es wird nicht lexikographisch vergleichen.Auf der anderen Seite
"-hello" == "-hello"
kann Rückkehr nicht gleich null, aber das bedeutet nicht, dass die==
operator vergleicht lexicographycally. Das ist aufgrund von anderen Tatsachen.Wenn Sie vergleichen wollen lexicographycally, können Sie immer
Lesen schwieriger sehe ich, dass ich Sie getaggt wie c++. So könnte man
Strings sind nicht einheimische Arten, in C., Was, die Sie vergleichen in diesem Beispiel sind zwei Zeiger. Ein zu Ihrem ersten argument, und die andere ist eine statische Zeichen-array mit dem Inhalt "-Hallo".
Sie wirklich wollen, zu verwenden strncmp oder etwas ähnliches.
Wenn man mit ==, du bist der Vergleich von Zeigern. Das heißt, es wird true zurückgeben, wenn die beiden Operanden beziehen sich auf den selben string im Speicher. Daher ist es ungeeignet für die Verwendung in vergleichen von strings lexikographisch.
Da C-strings sind Arrays von Zeichen. Arrays sind einfach Zeiger auf das erste element im array, und wenn Sie vergleichen zwei Zeiger mit == vergleicht es die Speicher-Adresse, auf die Sie verweisen, nicht die Werte, auf die Sie zeigen.