C String - Verwendung von Equality Operator == zum Vergleichen zweier Strings für die Gleichheit

8
%Vor% %Vor%

Warum? Ich realisiere, dass strcmp(argv[1], "-hello") == 0 wahr zurückgibt ... aber warum kann ich den Gleichheitsoperator nicht verwenden, um zwei C-Zeichenfolgen zu vergleichen?

    
Carlo del Mundo 14.10.2010, 13:27
quelle

9 Antworten

14

Weil argv[1] (zum Beispiel) eigentlich ein Zeiger auf die Zeichenkette ist. Sie vergleichen also nur Zeiger.

    
Oliver Charlesworth 14.10.2010, 13:30
quelle
11

Sie können Zeichenketten in C nicht mit == vergleichen, da der C-Compiler hinter Zeichenketten nicht wirklich einen Hinweis auf Zeichenketten hat.

Der Compiler sieht auf jeder Seite einen Vergleich mit einem char* , also einen Zeigervergleich (der die in den Zeigern gespeicherten Adressen vergleicht)

    
Bart van Ingen Schenau 14.10.2010 13:31
quelle
8

In C weil ein Array in den meisten Kontexten in einen Zeiger auf sein erstes Element zerfällt.

Also, wenn Sie das Array "foobar" haben und es in den meisten Kontexten verwenden, zerfällt es in einen Zeiger:

%Vor%

Was Sie wollen, um den Inhalt des Arrays mit etwas zu vergleichen. Sie können das manuell tun

%Vor%

oder automatisch

%Vor%     
pmg 14.10.2010 13:36
quelle
6

Weil es keine C-Zeichenfolge gibt.

In C ist ein String normalerweise ein Array von char oder ein Zeiger auf char (was fast derselbe ist). Der Vergleich eines Zeigers / Arrays mit einem const-Array führt nicht zu den erwarteten Ergebnissen.

UPDATE: Was ich mit 'no C string' meinte, ist, dass es in C keine Zeichenfolge gibt. Was normalerweise als 'C-String' bezeichnet wird, ist sprachunabhängig (wie 'Pascal string'), es ist die Darstellung von Strings als lineares Array von Zeichen mit Nullzeichen.

    
jv42 14.10.2010 13:30
quelle
4

In C werden Zeichenfolgenwerte (einschließlich Zeichenfolgenliterale) als Arrays von char gefolgt von einem 0-Terminator dargestellt, und Sie können den == -Operator nicht zum Vergleichen von Array-Inhalten verwenden. Die Sprache definiert die Operation einfach nicht.

Außer wenn es der Operand der Operatoren sizeof oder & ist oder wenn ein String-Literal zur Initialisierung eines anderen Arrays in einer Deklaration verwendet wird, ein Ausdruck vom Typ "N-Element-Array von T" Der Typ wird implizit konvertiert (zerfallen), um "Zeiger auf T" einzugeben, und der Wert des Ausdrucks ist die Adresse des ersten Elements des Arrays.

Also wenn du schreibst

%Vor%

Der Compiler wandelt implizit den Ausdruck "-hello" vom Typ "7-Elemente-Array von char" in "Zeiger auf char" um ( argv[1] ist bereits ein Zeigertyp), und der Wert des Ausdrucks ist Adresse des Zeichens '-' . Also, was == beim Vergleich vergleicht, sind zwei Zeiger Werte, die (wahrscheinlich) niemals gleich sind, da "-hello" und argv[1] (am wahrscheinlichsten) unterschiedliche Bereiche im Speicher belegen.

Aus diesem Grund müssen Sie Bibliotheksfunktionen wie strcmp() verwenden, um Zeichenfolgenwerte zu vergleichen.

    
John Bode 14.10.2010 16:54
quelle
2

Weil C-Strings nicht als solche existieren. Sie sind Char-Arrays, die in einem == enden.

Der Gleichheitsoperator "-hello" == "-hello" testet, dass der Zeiger auf das erste Element des Arrays gleich ist. Es wird nicht lexikographisch vergleichen.

Andererseits kann == nicht null zurückgeben, aber das bedeutet nicht, dass der Operator %code% lexikografisch vergleicht. Das liegt an anderen Fakten.

Wenn Sie lexikografisch vergleichen möchten, können Sie immer

%Vor%

Lesen Sie härter Ich sehe, dass Sie als C ++ markiert. Du könntest also

%Vor%     
Tom 14.10.2010 13:31
quelle
1

Strings sind keine nativen Typen in C. Was Sie in diesem Beispiel vergleichen, sind zwei Zeiger. Eins zu Ihrem ersten Argument und das andere ist ein statisches Zeichen-Array mit dem Inhalt "-hello".

Sie möchten wirklich strncmp oder etwas ähnliches verwenden.

    
kanaka 14.10.2010 13:31
quelle
0

Wenn Sie == verwenden, vergleichen Sie Zeiger. Das heißt, es wird wahr zurückgegeben, wenn sich die beiden Operanden auf die gleiche Zeichenfolge im Speicher beziehen. Daher ist es ungeeignet für den lexikografischen Vergleich von Strings.

    
waffle paradox 14.10.2010 13:31
quelle
-1

Weil C-Strings ein Array von Zeichen sind. Arrays sind einfach Zeiger auf das erste Element im Array, und wenn Sie zwei Zeiger mit == vergleichen, vergleicht sie die Speicheradresse, auf die sie zeigen, nicht die Werte, auf die sie zeigen.

    
Anthony 14.10.2010 13:31
quelle

Tags und Links