私はstrcmp()
Cで学んでいます.2つの文字列が等しい場合、strcmp
0を返すことを理解しています.
しかし、strcmp
最初の文字列が 2 番目の文字列よりも小さい場合に 0 未満を返すとマニュアル ページに記載されている場合、それは長さ、ASCII 値、または何か他のものを参照しているのでしょうか?
この意味で、文字列の「未満」は辞書順 (アルファベット順) を意味します。
Socat
はより小さいdog
のでcat
、アルファベット順で の前dog
です。
辞書式順序は、ある意味で、アルファベット順をすべての ASCII (および UNICODE) 文字に拡張したものです。
0 より大きい値は、一致しない最初の文字が 2 番目の文字列よりも最初の文字列の方が大きいことを示し、0 より小さい値はその逆を示します。
C99 7.21.4:
比較関数 memcmp、strcmp、およびstrncmpによって返されるゼロ以外の値の符号は、比較されるオブジェクトで異なる最初の文字ペア (どちらもunsigned charとして解釈される) の値の差の符号によって決定されます。
特に、結果は現在のロケールに依存しないことに注意してください。LC_COLLATE
(C99 7.11 を参照) は および に影響しますが、 には影響strcoll()
しstrxfrm()
ませんstrcmp()
。
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;
}