2016-04-09 8 views
2

Ich verstehe, dass, wenn Sie 'cat' (string1) und 'dog' (string2) in strcmp haben (dies ist eine C-Frage), der Rückgabewert von strcmp kleiner als 0 wäre (da 'cat' lexikalisch kleiner ist als 'Hund').Was gibt strcmp zurück, wenn zwei ähnliche Strings unterschiedliche Längen haben?

Ich bin aber nicht sicher, was mit strcmp passieren würde, wenn dies geschehen ist:

string1: 'dog' 
string2: 'dog2'. 

Was würde strcmp zurückkehren? Weniger als Null, Null oder größer als? Für den Kontext versuche ich eine Komparatorfunktion zu schreiben, die Strings vergleicht und Zeichenfolgen berücksichtigen möchte, die mit den gleichen Zeichen beginnen. Eine Zeichenfolge kann eine Erweiterung haben (z. B. "2" in "dog2" im obigen Beispiel).

EDIT: Dies ist keine doppelte Frage. Die Frage, die dem ähnlich ist, fragt, was der Rückgabetyp repräsentiert - ich sage, was passiert, wenn die Strings bis zu einem Punkt identisch sind, aber dann stoppt einer von ihnen, während der andere fortfährt.

+1

Warum nicht einfach versuchen? –

+1

Mögliches Duplikat von [strcmp() - Rückgabewerten in c] (http: // stackoverflow.com/questions/7656475/strcmp-return-values-in-c) – MicroVirus

+1

Weil ich mit C gefunden habe, dass die Dinge nicht immer konsistent sind. Die Größen von Typen sind ein gutes Beispiel dafür. –

Antwort

2

Gibt den Unterschied im Oktett zurück, der sich unterscheidet. In Ihrem Beispiel '\0' < '2' wird also etwas Negatives zurückgegeben.

+0

Oh, es ist im Grunde das Nullzeichen vergleichen? Das ist immer weniger als alles andere, nicht wahr? –

1

Von Menschen Strcmp:

The strcmp() und strncmp() Funktionen geben eine ganze Zahl kleiner, gleich oder größer als Null ist, wenn s1 (oder die ersten n Bytes davon) gefunden wird jeweils kleiner als, übereinzustimmen oder größer als s2 zu sein.

Dies würde normalerweise wie @hroptyr beschrieben werden beschreibt.

+0

Also nur um Thomas zu klären - das Nullzeichen am Ende der kürzeren Saite wird verglichen und somit ist die kleinere Saite "kleiner als" die größere Saite? –

+1

@DanielSoutar Ja. – totoro

+0

danke, das hilft –

1

Es ist in der C-Norm als der Unterschied zwischen den ersten beiden nicht übereinstimmenden Zeichen definiert, aber die Implementierung ist wild. Der einzige gemeinsame Punkt ist, dass der Rückgabewert für gleiche Strings gleich Null ist, und dann <0 or >0 für str1<str2 und . Von ISO/IEC 9899: 201x, §7.23.4 Vergleichsfunktionen:

Das Zeichen eines Nicht-Null-Wert von den Vergleichsfunktionen zurück memcmp, strcmp und strncmp durch das Vorzeichen des bestimmt wird Unterschied zwischen den Werten des ersten Zeichenpaars (beide interpretiert als vorzeichenloses Zeichen), die sich in den Objekten unterscheiden, die verglichen werden.

Bei einigen Implementierungen müssen jedoch typische Werte wie 0, 1 and -1 zurückgegeben werden. Siehe z.B.die Apple-Implementierung (http://opensource.apple.com//source/Libc/Libc-262/ppc/gen/strcmp.c):

int 
strcmp(const char *s1, const char *s2) 
{ 
    for (; *s1 == *s2; s1++, s2++) 
    if (*s1 == '\0') 
     return 0; 
    return ((*(unsigned char *)s1 < *(unsigned char *)s2) ? -1 : +1); 
} 

EDIT: Im Android-Boot-Bibliothek für Donut-Release (https://android.googlesource.com/platform/bootable/bootloader/legacy/+/donut-release/libc/strcmp.c) liefert die Funktion 0 wenn Strings gleich und 1 für die anderen zwei Fälle sind, und werden nur logisch verwendet Operationen:

int strcmp(const char *a, const char *b) 
{ 
    while(*a && *b) { 
     if(*a++ != *b++) return 1; 
    } 
    if(*a || *b) return 1; 
    return 0; 
} 
0

C11 zitiert

C11 N1570 standard draft

ich "dog" < "dog2" denken wird durch die folgenden Zitate garantiert:

7.23.4 Vergleichsfunktionen Das Zeichen eines Nicht-Null-Wert durch den Vergleich zurück Funktionen memcmp, strcmp, und strncmp wird durch die bestimmt Zeichen des Unterschieds zwischen den Werten des ersten Zeichenpaares (beide interpretiert als unsigned char), die sich in den Objekten unterscheiden, die verglichen werden.

So sind die Zeichen als Zahlen interpretiert werden, und '\0' garantiert 0 sein:

Dann:

7.23.4.2 Die strcmp Funktion Die strcmp Funktion den String spitze vergleicht um mit s1 zu der Zeichenfolge, auf die s2 zeigt.

sagt, dass offensichtlich sind Strings verglichen und:

7.1.1 Definitionen der Begriffe 1 Eine Zeichenfolge eine zusammenhängende Sequenz von Zeichen, die von und einschließlich der ersten Null Zeichen beendet.

sagt, dass die Null Teil der Zeichenfolge ist.

Schließlich:

5.2.1 Zeichensätze 2 [...] ein Byte mit alle Bits auf 0 gesetzt, das Nullzeichen bezeichnet, so wird in der Grundausführungszeichensatz vorhanden sind; Es wird verwendet, um eine Zeichenfolge zu beenden.

so '\0' ist gleich Null.

Da die Interpretation wie unsigned char ist, und alle Zeichen sind unterschiedlich, ist Null die kleinste mögliche Anzahl.