文字列を比較するには、以下のいずれかの関数を使う。
- 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 */