Verwenden des Gleichheitsoperators == zum Vergleichen zweier Zeichenfolgen auf Gleichheit in C [duplicate]
Lesezeit: 4 Minuten
int main (int argc, **argv)
{
if (argv[1] == "-hello")
printf("True\n");
else
printf("False\n");
}
# ./myProg -hello
False
Wieso den? ich verstehe strcmp(argv[1], "-hello") == 0 gibt true zurück … aber warum kann ich den Gleichheitsoperator nicht verwenden, um zwei C-Strings zu vergleichen?
Da Sie darauf bestehen, dass die Frage eine C-Frage ist, habe ich den C++-Code durch C-Code ersetzt. Wenn Sie auf std::cout bestehen, ich Bestehen Sie auf einem C++-Tag.
– JeremyP
14. Oktober 2010 um 14:44 Uhr
Sicherlich ist diese Frage ein exaktes Duplikat.
– R.. GitHub HÖR AUF, EIS ZU HELFEN
15. Oktober 2010 um 2:30 Uhr
Da argv[1] (zum Beispiel) ist eigentlich ein Zeiger auf die Zeichenfolge. Sie vergleichen also nur Zeiger.
Sie können Strings in C nicht mit == vergleichen, weil der C-Compiler nicht wirklich eine Ahnung von Strings hat, die über ein String-Literal hinausgehen.
Der Compiler sieht einen Vergleich mit a char* auf beiden Seiten, also führt es einen Zeigervergleich durch (der die in den Zeigern gespeicherten Adressen vergleicht)
pmg
Im C weil in den meisten Kontexten ein Array “in einen Zeiger auf sein erstes Element zerfällt”.
Also, wenn Sie das Array haben "foobar" und es in den meisten Kontexten verwenden, zerfällt es in einen Zeiger:
if (name == "foobar") /* ... */; /* comparing name with a pointer */
Was willst du damit vergleichen Inhalt des Arrays mit etwas. Sie können das manuell tun
if (strcmp(name, "foobar")) /* name is not "foobar" */;
if(strcmp(name, "foobar")) wird zu false ausgewertet, wenn Zeichenfolgen äquivalent sind, da es in diesem Fall 0 zurückgibt. if (strcmp(name, "foobar") == 0) wäre besser
– Overdriver
13. Januar 2016 um 17:46 Uhr
Danke für die Hinweise @Overdrivr. Kommentar zum Code hinzugefügt, um es klarer zu machen.
– pmg
14. Januar 2016 um 10:15 Uhr
jv42
Weil es keine C-Saite gibt.
In C ist ein String normalerweise ein Array von char oder ein Zeiger auf char (was fast dasselbe ist). Der Vergleich eines Zeigers/Arrays mit einem konstanten Array führt nicht zu den erwarteten Ergebnissen.
UPDATE: Was ich mit ‘kein C-String’ meinte, ist, dass es in C keinen String gibt. Was normalerweise als ‘C-String’ bezeichnet wird, ist sprachunabhängig (wie ‘Pascal-String’), es ist die Darstellung von Strings als Null -terminiertes lineares Array von Zeichen.
Johannes Bode
In C werden Zeichenfolgenwerte (einschließlich Zeichenfolgenliterale) als Arrays von dargestellt char gefolgt von einem 0-Terminator, und Sie können die nicht verwenden == Operator zum Vergleichen von Array-Inhalten; die Sprache definiert einfach nicht die Operation.
Außer wenn es der Operand von entweder dem ist sizeof oder & Operatoren, oder wenn es sich um ein Zeichenfolgenliteral handelt, das zum Initialisieren eines anderen Arrays in einer Deklaration verwendet wird, wird der Typ eines Ausdrucks mit dem Typ “N-Element-Array von T” implizit in den Typ “Zeiger auf T” konvertiert (Zerfall), und die Der Wert des Ausdrucks ist die Adresse des ersten Elements des Arrays.
Also beim Schreiben
if (argv[1] == "-hello")
der Compiler konvertiert den Ausdruck implizit "-hello" vom Typ „7-element array of char“ zu „pointer to char“ (argv[1] ist bereits ein Zeigertyp), und der Wert des Ausdrucks ist der die Anschrift des Charakters '-'. Na und == winds up Vergleich sind zwei Zeiger Werte, die seitdem (höchstwahrscheinlich) nie mehr gleich sein werden "-hello" und argv[1] (höchstwahrscheinlich) verschiedene Regionen im Gedächtnis besetzen.
Aus diesem Grund müssen Sie Bibliotheksfunktionen wie verwenden strcmp() Stringwerte zu vergleichen.
In C werden Zeichenfolgenwerte (einschließlich Zeichenfolgenliterale) als Arrays von dargestellt chardie einschließen ein 0-Terminator …
– pmg
17. März 2016 um 16:33 Uhr
Weil C-Saiten als solche nicht existieren. Sie sind char-Arrays, die auf a enden \0.
Der Gleichheitsoperator == testet, ob die Zeiger auf das erste Element des Arrays gleich sind. Lexikografisch lässt es sich nicht vergleichen.
Auf der anderen Seite "-hello" == "-hello"kann Nicht Null zurückgeben, aber das bedeutet nicht, dass die == Operator vergleicht lexikographisch. Das liegt an anderen Tatsachen.
Wenn Sie lexikographisch vergleichen wollen, können Sie das immer
#define STR_EQ(s1,s2) \
strcmp(s1,s2) == 0
Wenn ich genauer lese, sehe ich, dass Sie als c ++ gekennzeichnet sind. Also könntest du
In C werden Zeichenfolgenwerte (einschließlich Zeichenfolgenliterale) als Arrays von dargestellt chardie einschließen ein 0-Terminator …
– pmg
17. März 2016 um 16:33 Uhr
Kanaka
Strings sind keine nativen Typen in C. Was Sie in diesem Beispiel vergleichen, sind zwei Zeiger. Eines zu Ihrem ersten Argument und das andere ist ein statisches Zeichenarray mit dem Inhalt von “-hello”.
Sie möchten wirklich strncmp oder etwas Ähnliches verwenden.
12586200cookie-checkVerwenden des Gleichheitsoperators == zum Vergleichen zweier Zeichenfolgen auf Gleichheit in C [duplicate]yes
Da Sie darauf bestehen, dass die Frage eine C-Frage ist, habe ich den C++-Code durch C-Code ersetzt. Wenn Sie auf std::cout bestehen, ich Bestehen Sie auf einem C++-Tag.
– JeremyP
14. Oktober 2010 um 14:44 Uhr
Sicherlich ist diese Frage ein exaktes Duplikat.
– R.. GitHub HÖR AUF, EIS ZU HELFEN
15. Oktober 2010 um 2:30 Uhr