web-dev-qa-db-ja.com

2つの類似した文字列の長さが異なる場合、strcmpは何を返しますか?

Strcmpに「cat」(string1)と「dog」(string2)がある場合(これはCの質問です)、strcmpの戻り値は0未満になることを理解しています(「cat」は字句的に「dog」よりも小さいため) ')。

ただし、これが発生した場合、strcmpで何が起こるかわかりません。

string1: 'dog'
string2: 'dog2'.

Strcmpは何を返しますか?ゼロ未満、ゼロ、またはより大きい?コンテキストとして、文字列を比較し、同じ文字で始まる文字列を考慮したいコンパレータ関数を作成しようとしています。 1つの文字列に拡張子を付けることができます(上記の例の「dog2」の「2」など)。

編集:これは重複した質問ではありません。これが似ているとされる質問は、戻り値の型が何を表すかを尋ねます-文字列がポイントまで同一であるが、一方が停止し、もう一方が継続する場合はどうなるかを言っています。

9
Daniel Soutar

異なるオクテットでの差を返します。あなたの例では'\0' < '2'したがって、何か否定的なものが返されます。

2
hroptatyr

これは、C標準では、最初の2つの一致しない文字の違いとして定義されていますが、実装はワイルドです。唯一の共通点は、等しい文字列の場合は戻り値がゼロであり、<0 or >0str1<str2の場合はそれぞれstr1>str2です。 ISO/IEC 9899:201x、§7.23.4比較関数から:

比較関数memcmp、strcmp、およびstrncmpによって返されるゼロ以外の値の符号は、比較されるオブジェクトが異なる最初の文字ペア(両方ともunsigned charとして解釈される)の値の差の符号によって決定されます。

ただし、一部の実装では、一般的な値を0, 1 and -1として返すように注意しています。つまり、Apple実装( 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);
}

編集:Androidドーナツリリースのブートライブラリ( https://Android.googlesource.com/platform/bootable/bootloader/legacy/+/donut-release/libc /strcmp.c )この関数は、文字列が等しい場合は0を返し、他の2つの場合は1を返し、論理演算でのみ使用されます。

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

C11引用符

C11 N1570標準ドラフト

"dog" < "dog2"は次の引用符で保証されていると思います。

7.23.4比較関数1比較関数memcmp、strcmp、およびstrncmpによって返されるゼロ以外の値の符号は、最初の文字ペアの値の差の符号によって決定されます(どちらもnsignedcharとして解釈されます)。)比較対象のオブジェクトが異なります。

したがって、文字は数字として解釈され、'\0'0であることが保証されます。

次に:

7.23.4.2strcmp関数2strcmp関数は、s1が指す文字列をs2が指す文字列と比較します。

明らかに、文字列が比較されると言っています、そして:

7.1.1用語の定義1文字列は、最初のヌル文字で終了し、それを含む文字の連続したシーケンスです。

nullが文字列の一部であることを示します。

最後に:

5.2.1文字セット2 [...]ヌル文字と呼ばれる、すべてのビットが0に設定されたバイトは、基本実行文字セットに存在する必要があります。文字列を終了するために使用されます。

したがって、'\0'はゼロに等しくなります。

解釈はunsigned charであり、すべての文字が異なるため、ゼロは可能な最小の数です。

男strcmpから:

Strcmp()およびstrncmp()関数は、s1(またはその最初のnバイト)がそれぞれs2より小さい、一致する、または大きいことがわかった場合、ゼロより小さい、等しい、またはより大きい整数を返します。 。

これは通常、@ hroptatyrが説明するように実装されます。

1
totoro