見出し画像

C言語-#6.str*cmp

はお。

文字列の比較っすよ!

strcmp
strncmp
stricmp
strnicmp


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のときは一致、違う時は負か正の値が返ります。本当は -11なんですけどね。

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が基底になりそうな気もしますが、一文字ずつの比較なのでそうはならないなんですよね。ってことで、もっと最適解がありそうです。