私はstrcasecmp
Cで関数を再実装しようとしていますが、比較プロセスで矛盾しているように見えるものに気づきました。
から man strcmp
strcmp()関数は、2つの文字列s1とs2を比較します。ロケールは考慮されません(ロケール対応の比較については、strcoll(3)を参照)。s1がそれぞれs2より小さい、一致する、またはs2より大きい場合、ゼロより小さい、等しい、またはゼロより大きい整数を返します。
から man strcasecmp
strcasecmp()関数は、文字の大文字と小文字を無視して、文字列s1とs2のバイト単位の比較を実行します。s1がそれぞれs2より小さい、一致する、またはs2より大きい場合、ゼロより小さい、等しい、またはゼロより大きい整数を返します。
int strcmp(const char *s1, const char *s2);
int strcasecmp(const char *s1, const char *s2);
この情報を考えると、次のコードの結果は理解できません。
#include <stdio.h>
#include <string.h>
int main()
{
// ASCII values
// 'A' = 65
// '_' = 95
// 'a' = 97
printf("%i\n", strcmp("A", "_"));
printf("%i\n", strcmp("a", "_"));
printf("%i\n", strcasecmp("A", "_"));
printf("%i\n", strcasecmp("a", "_"));
return 0;
}
出力:
-1 # "A" is less than "_"
1 # "a" is more than "_"
2 # "A" is more than "_" with strcasecmp ???
2 # "a" is more than "_" with strcasecmp
の現在の文字が文字の場合、現在の文字s1
が文字かどうかに関係なく、常に小文字に変換されるようs2
です。
誰かがこの動作を説明できますか?1行目と3行目を同じにしないでください。
前もって感謝します!
PS:
私はgcc 9.2.0
Manjaroで使用しています。
また、-fno-builtin
フラグを付けてコンパイルすると、代わりに次のようになります。
-30
2
2
2
プログラムがgccの最適化された関数を使用していないためだと思いますが、問題は残っています。
strcasecmp
あなたが参照している説明は正確ではないようです。賛成投票の回答の詳細。
A < _ && a > _ && A == a
非常に多くの問題を引き起こすでしょう。
unsigned char
。C17 / 18 "文字列処理<string.h>"-> "この副次句のすべての関数で、各文字は、型を持つものとして解釈されunsigned char
ます。これにより、char
値がASCII範囲0〜127の範囲外になると、違いが生じます。
printf("%i\n", strcasecmp("a", "_"));
これは、おそらくと同じ結果になるはずですが、これは、これらの2つの大文字と小文字を区別しない呼び出しの1つが、大文字と小文字を区別する対応と一致しないprintf("%i\n", strcasecmp("A", "_"));
ことを意味します。