Strcmpに「cat」(string1)と「dog」(string2)がある場合(これはCの質問です)、strcmpの戻り値は0未満になることを理解しています(「cat」は字句的に「dog」よりも小さいため) ')。
ただし、これが発生した場合、strcmpで何が起こるかわかりません。
string1: 'dog'
string2: 'dog2'.
Strcmpは何を返しますか?ゼロ未満、ゼロ、またはより大きい?コンテキストとして、文字列を比較し、同じ文字で始まる文字列を考慮したいコンパレータ関数を作成しようとしています。 1つの文字列に拡張子を付けることができます(上記の例の「dog2」の「2」など)。
編集:これは重複した質問ではありません。これが似ているとされる質問は、戻り値の型が何を表すかを尋ねます-文字列がポイントまで同一であるが、一方が停止し、もう一方が継続する場合はどうなるかを言っています。
異なるオクテットでの差を返します。あなたの例では'\0' < '2'
したがって、何か否定的なものが返されます。
これは、C標準では、最初の2つの一致しない文字の違いとして定義されていますが、実装はワイルドです。唯一の共通点は、等しい文字列の場合は戻り値がゼロであり、<0 or >0
とstr1<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;
}
C11引用符
"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が説明するように実装されます。