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?
Weil argv[1]
(zum Beispiel) eigentlich ein Zeiger auf die Zeichenkette ist. Sie vergleichen also nur Zeiger.
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)
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:
Was Sie wollen, um den Inhalt des Arrays mit etwas zu vergleichen. Sie können das manuell tun
%Vor%oder automatisch
%Vor%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.
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.
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%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.