Was gibt strcmp zurück, wenn zwei ähnliche Strings unterschiedlich lang sind?

Lesezeit: 4 Minuten

Benutzer-Avatar
Daniel Soutar

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 ‘dog ‘).

Ich bin mir jedoch nicht sicher, was in diesem Fall mit strcmp passieren würde:

string1: 'dog'
string2: 'dog2'.

Was würde strcmp zurückgeben? Kleiner als null, null oder größer als? Für den Kontext versuche ich, eine Komparatorfunktion zu schreiben, die Zeichenfolgen vergleicht und Zeichenfolgen berücksichtigen möchte, die mit denselben Zeichen beginnen. Eine Zeichenfolge kann eine Erweiterung haben (z. B. „2“ in „Hund2“ im obigen Beispiel).

EDIT: Dies ist keine doppelte Frage. Die Frage, dass dies angeblich ähnlich ist, fragt, was der Rückgabetyp darstellt – ich sage, was passiert, wenn die Zeichenfolgen bis zu einem gewissen Punkt identisch sind, aber dann einer von ihnen stoppt, während der andere fortfährt.

  • Warum nicht einfach ausprobieren?

    – Irgendein Programmierer-Typ

    9. April 2016 um 15:36 Uhr

  • Mögliches Duplikat der Rückgabewerte von strcmp() in c

    – Mikrovirus

    9. April 2016 um 15:39 Uhr

  • Weil ich bei C festgestellt habe, dass die Dinge nicht immer konsistent sind. Die Größe der Typen ist ein gutes Beispiel dafür.

    – Daniel Sutar

    9. April 2016 um 15:40 Uhr

  • C ist sehr konsistent. Wenn Sie ein inkonsistentes Verhalten haben, muss ich leider sagen, dass Sie wahrscheinlich etwas falsch verstanden oder etwas falsch gemacht haben. Oder meinst du wie sizeof(int) das ist implementierungsabhängig? Es ist still konsistent, da es wie im formalen C-Standard spezifiziert funktioniert. Zeichenfolgen und ihr Verhalten sind zwischen Plattformen und Implementierungen konsistent, aber ich gebe zu, dass die Zeichencodierung unterschiedlich sein kann, aber das Verhalten von Zeichenfolgen und Zeichen- und Stringfunktionen ist immer noch konsequent.

    – Irgendein Programmierer-Typ

    9. April 2016 um 16:06 Uhr

Es gibt die Differenz am Oktett zurück, das sich unterscheidet. In deinem Beispiel '\0' < '2' also wird etwas negatives zurückgegeben.

  • Oh, also vergleicht es im Grunde das Nullzeichen? Das ist immer weniger als alles andere, oder?

    – Daniel Sutar

    9. April 2016 um 15:41 Uhr

Benutzer-Avatar
Frankie_C

Es ist im C-Standard 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 Zeichenfolgen jeweils null ist <0 or >0 zum str1<str2 und str1>str2. Aus ISO/IEC 9899:201x, §7.23.4 Vergleichsfunktionen:

Das Vorzeichen eines von den Vergleichsfunktionen memcmp, strcmp und strncmp zurückgegebenen Werts ungleich Null wird durch das Vorzeichen der Differenz zwischen den Werten des ersten Zeichenpaars (beide als unsigned char interpretiert), die sich in den verglichenen Objekten unterscheiden, bestimmt.

Einige Implementierungen achten jedoch darauf, typische Werte als zurückzugeben 0, 1 and -1. 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);
}

BEARBEITEN: In der Android-Boot-Bibliothek für Donut-Release (https://android.googlesource.com/platform/bootable/bootloader/legacy/+/donut-release/libc/strcmp.c) gibt die Funktion zurück 0 wenn Zeichenfolgen gleich sind und 1 für die anderen 2 Fälle und werden nur logische Operationen verwendet:

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

C11-Zitate

C11 N1570 Standardentwurf

Ich finde "dog" < "dog2" wird durch die folgenden Zitate garantiert:

7.23.4 Vergleichsfunktionen 1 Das Vorzeichen eines von den Vergleichsfunktionen memcmp, strcmp und strncmp zurückgegebenen Werts ungleich Null wird durch das Vorzeichen der Differenz zwischen den Werten des ersten Zeichenpaars (beide interpretiert als unsigned char), die sich in den verglichenen Objekten unterscheiden.

Die Zeichen werden also als Zahlen interpretiert, und '\0' ist es garantiert 0:

Dann:

7.23.4.2 Die strcmp-Funktion 2 Die strcmp-Funktion vergleicht den String, auf den s1 zeigt, mit dem String, auf den s2 zeigt.

sagt, dass offensichtlich Zeichenfolgen verglichen werden, und:

7.1.1 Begriffsdefinitionen 1 Ein String ist eine zusammenhängende Folge von Zeichen, die mit dem ersten Nullzeichen abgeschlossen wird und dieses enthält.

sagt, dass die Null Teil der Zeichenfolge ist.

Endlich:

5.2.1 Zeichensätze 2 […] Ein Byte, bei dem alle Bits auf 0 gesetzt sind, das als Nullzeichen bezeichnet wird, muss im grundlegenden Ausführungszeichensatz vorhanden sein; es wird verwendet, um eine Zeichenkette abzuschließen.

Also '\0' gleich Null ist.

Da ist die Interpretation als unsigned charund alle Zeichen sind unterschiedlich, Null ist die kleinstmögliche Zahl.

Benutzer-Avatar
totoro

Von manstrcmp:

Die Funktionen strcmp() und strncmp() geben eine ganze Zahl zurück, die kleiner, gleich oder größer als Null ist, wenn festgestellt wird, dass s1 (oder die ersten n Bytes davon) kleiner als, übereinstimmend oder größer als s2 ist .

Dies würde normalerweise wie von @hroptatyr beschrieben implementiert.

Wenn Sie nur die Initiale vergleichen möchten len Zeichen zweier Strings, verwenden Sie strncmp statt strcmp:

#include <string.h>
size_t len = 3;
int res = strncmp("dog", "dog2", len);

res ist in diesem Fall 0.

1159460cookie-checkWas gibt strcmp zurück, wenn zwei ähnliche Strings unterschiedlich lang sind?

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

Privacy policy