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)

Benutzer-Avatar
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 ('p' == *("foobar")) /* ... */; /* false: 'p' != 'f' */
if ('m' == *("foobar"+1)) /* ... */; /* false: 'm' != 'o' */
if ('g' == *("foobar"+2)) /* ... */; /* false: 'g' != 'o' */

oder automatisch

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

Benutzer-Avatar
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.

Benutzer-Avatar
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 char die 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

 std::string arg1 ( argv[1] );

 if (arg1 == "-hello"){
    // yeahh!!!
 }
 else{
    //awwwww
 }

  • In C werden Zeichenfolgenwerte (einschließlich Zeichenfolgenliterale) als Arrays von dargestellt char die einschließen ein 0-Terminator …

    – pmg

    17. März 2016 um 16:33 Uhr

Benutzer-Avatar
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.

1258620cookie-checkVerwenden des Gleichheitsoperators == zum Vergleichen zweier Zeichenfolgen auf Gleichheit in C [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy