C言語-#6.str*cmp
はお。
文字列の比較っすよ!
strncmp
int strncmp(const char* s1, const char* s2, int len) {
int ret = 0;
// 結果が違うか len が 0 になるまで
while (0 < len) {
ret = *s1 - *s2;
if (ret) {
break;
}
// 比較サイズを減らす
--len;
// 文字列のポインタを進める
++s1;
++s2;
}
return ret; // diff ok
}
文字列の先頭から n文字比較して一致する先頭アドレスを返します。戻り値が 0のときは一致、違う時は負か正の値が返ります。本当は -1か 1なんですけどね。
strnicmp
int strnicmp(const char* s1, const char* s2, int len) {
int ret = 0;
// 結果が違うか len が 0 になるまで
while (0 < len) {
ret = tolower(*s1) - tolower(*s2);
if (ret) {
break;
}
// 比較サイズを減らす
--len;
// 文字列のポインタを進める
++s1;
++s2;
}
return ret; // diff ok
}
文字列の先頭から n文字比較して一致する先頭アドレスを返します。このとき比較する文字を小文字に変換して比較するので Caseは考慮されずに比較することができます。
stricmp
int stricmp(const char* s1, const char* s2) {
int len1 = strlen(s1);
int len2 = strlen(s2);
return strnicmp(s1, s2, (s1 < s2) ? len2 : len1);
}
文字列の先頭から比較して一致する先頭アドレスを返します。ここではすでにある strnicmp関数を使用しますが、引数3に渡す値は長いほうの文字列の文字数を渡します。また、長いほうが最後まで到達しなくても短いほうが NULL終了します。
strcmp
int strcmp(const char* s1, const char* s2) {
int len1 = strlen(s1);
int len2 = strlen(s2);
return strncmp(s1, s2, (len1 < len2) ? len2 : len1);
}
2つの文字列を先頭から比較します。この中では一番よく使う関数ですよね。
すでにある strncmp関数を使用します。
おしまい
あるものは有効に使います。全部スクラッチなんてしてたらバグの温床になるだけです……。
関数名から strnicmpが基底になりそうな気もしますが、一文字ずつの比較なのでそうはならないなんですよね。ってことで、もっと最適解がありそうです。