2016-03-31 15 views
0
char str1[]="abc"; 
char str2[]="abc"; 

if (str1==str2) 
    printf("Yes") 
else 
    printf("No"); 

Ich aktualisiere meine C. Würde der obige Code nicht "Ja" zurückgeben? Ich denke, es würde, weil str1 und str2 auf die ersten Elemente des Arrays zeigen, die die gleichen sind (der Buchstabe a). Bitte sagen Sie mir, wenn mir etwas fehlt.Vergleich der Zeichenfolgen in C

+4

Nein. Sie vergleichen Adressen. Deshalb existiert strcmp. – OldProgrammer

+0

hängt wirklich ab, wenn der Compiler String Interning als Optimierung – isedev

+0

Sie müssen herausfinden, was ein Zeiger ist. –

Antwort

0

Der Variablenname eines char-Arrays entspricht einem Zeiger auf die Adresse des ersten Elements des Arrays. Was Sie also vergleichen, sind Zeiger. Sie sind nicht äquivalent, weil die Adresse der zwei Variablen im Speicher nicht äquivalent ist.

+0

Verstanden. Danke für Ihre Hilfe. –

0

Technisch gesehen vergleichen Sie Stringadressen. Ohne Optimierungen ist die erwartete Antwort "Nein" (zwei verschiedene Strings, also zwei Adressen).

Die meisten modernen Compiler führen jedoch String-Interning durch (Zusammenführen von identischen Konstantenstrings), in welchem ​​Fall die Antwort "Ja" wäre. Beachten Sie, dass dies nur für Zeichenfolgenliterale geschieht.

Zum Beispiel GCC 4.9.2 tut dies, indem Standard:

#include <stdio.h> 
int 
main() 
{ 
    char *ptr1 = "abc"; 
    char *ptr2 = "abc"; 
    printf("%p\n%p\n",ptr1,ptr2); 
    if (ptr1 == ptr2) printf("yes\n"); 
} 

gcc -o /tmp/file /tmp/file.c 

/tmp/file 
0x400660 
0x400660 
yes 

Interessanterweise Verhalten unterscheidet (das heißt keine Internierung), wenn die Variablen deklarieren char ptr1[] und char ptr2[]. Dies liegt daran, dass der Compiler in diesem Fall die Zeichenfolgen tatsächlich auf dem Stapel platziert (siehe here).

Wie in den Kommentaren angegeben, ist der richtige Weg, Strings zu vergleichen, strcmp und verwandte Funktionen.

+0

In * allen * Fällen wäre die Antwort "Nein" zu dem in der Frage angegebenen Code. Du scheinst eine andere Frage zu beantworten ... – immibis

+0

Ja, zugegebenermaßen habe ich es herausgefunden, als ich mitging :) – isedev