怠日記

写真・金魚・昆虫・プログラミングの趣味を語るサイトです。似たようなことをnoteにも書いたり書いてなかったり。

C言語 - 文字列を比較する | strcmp(), strncmp(), strcasecmp(), strncasecmp()

文字列を比較するには、以下のいずれかの関数を使う。

  • strcmp()
    • 文字列の比較
  • strncmp()
    • strcmp() の文字数指定版
  • strcasecmp()
    • 大文字小文字を区別しない文字列の比較
  • strncasecmp()
    • strcasecmp() の文字数指定版

文字列を比較する

#include <string.h>
int strcmp(const char *string1, const char *string2);

引数

  • string1, string2
    比較に使う文字列

戻り値

  • string1 が string2 より小さい → 0 より小さい値
  • string1 が string2 と等しい → 0
  • string1 が string2 より大きい → 0 より大きい値
 

NULL を比較するとどうなる?

‘\0’ はヌル文字。文字列の終端を表す。

NULL はヌルポインタ。 ヌルポインタとは、ポインタがどのアドレスも指していない状態を表す。
((void *)0) と定義されている。

なので strcmp() に NULL を使うのは本当は誤りである。

が、それでも試してみた結果、NULL 同士の比較は 0 、つまり等しいと判定された。

NULL と NULL 以外の値の比較は異常終了になった。

strcmp(NULL, NULL)  → 0
strcmp(NULL, "\0")  → 異常終了
strcmp("\0", NULL)  → 異常終了

ちなみに異常終了時の ERRORLEVEL は -1073741819 だった。

> echo %ERRORLEVEL%
-1073741819

文字数指定での文字列の比較

strcmp() と似ているが、こちらは比較する文字数を指定できる。

先頭N文字が一致するか? というような比較に使える。

#include <string.h>
int strncmp(const char *string1, const char *string2, size_t count);

引数

  • string1, string2
    比較に使う文字列

  • count
    比較する文字数。
    もしここで指定した文字数になる前にヌル文字が検出された場合、その時点で比較終了となる。

戻り値

  • string1 が string2 より小さい → 0 より小さい値
  • string1 が string2 と等しい → 0
  • string1 が string2 より大きい → 0 より大きい値

/* 先頭3文字を比較する */
printf("%d\n", strncmp("strcmp", "strncmp", 3));
/* → 0 */

/* 指定した文字数になる前にヌル文字が検出されたらそこで終了 */
printf("%d\n", strncmp("abcde", "a", 3));
/* → 1 */

printf("%d\n", strncmp("a", "abcde", 3));
/* → -1 */

printf("%d\n", strncmp("a", "a", 3));
/* → 0 */

大文字小文字を区別しない文字列の比較

大文字小文字を区別せずに文字列を比較する。

(大文字小文字を区別しない strcmp() と覚えておく)

すべての英字は小文字に変換されてから比較される。

#include <strings.h>
int strcasecmp(const char *string1, const char *string2);

引数

  • string1, string2
    比較に使う文字列

戻り値

  • string1 が string2 より小さい → 0 より小さい値
  • string1 が string2 と等しい → 0
  • string1 が string2 より大きい → 0 より大きい値

printf("%d\n", strcasecmp("abc", "ABC"));
/* → 0 */

大文字小文字を区別しない、文字数指定での文字列の比較

大文字小文字を区別せずに、指定された文字数分の文字列を比較する。

(大文字小文字を区別しない strncmp() と覚えておく)

すべての英字は小文字に変換されてから比較される。

#include <strings.h>
int strncasecmp(const char *string1, const char *string2, size_t count);

引数

  • string1, string2
    比較に使う文字列

  • count
    比較する文字数。
    もしここで指定した文字数になる前にヌル文字が検出された場合、その時点で比較終了となる。

戻り値

  • string1 が string2 より小さい → 0 より小さい値
  • string1 が string2 と等しい → 0
  • string1 が string2 より大きい → 0 より大きい値

/* 先頭3文字を比較する */
printf("%d\n", strncasecmp("strcmp", "STRNCMP", 3));
/* → 0 */

/* 指定した文字数になる前にヌル文字が検出されたらそこで終了 */
printf("%d\n", strncasecmp("ABCDE", "a", 3));
/* → 98 */

printf("%d\n", strncasecmp("A", "abcde", 3));
/* → -98 */

printf("%d\n", strncasecmp("a", "A", 3));
/* → 0 */