Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
strcmp() / strncmp()
2つの文字列を辞書順で比較する関数です。文字列の等値判定やソートの比較ロジックに使います。文字列は『==』演算子では比較できないため、必ずこれらの関数を使います。
構文
// s1 と s2 を辞書順で比較します。 // 戻り値: s1 < s2 なら負、s1 == s2 なら 0、s1 > s2 なら正。 int strcmp(const char *s1, const char *s2); // 先頭 n バイトだけ比較します。 int strncmp(const char *s1, const char *s2, size_t n); // 大文字・小文字を区別しない比較です(POSIX拡張、標準Cではありません)。 int strcasecmp(const char *s1, const char *s2); // Unix系 // Windows 環境での大文字・小文字を区別しない比較です。 int _stricmp(const char *s1, const char *s2); // Windows (MSVC)
戻り値の意味
| 戻り値 | 意味 | 使い方の例 |
|---|---|---|
| 0 | 2つの文字列は等しい | 『if (strcmp(a, b) == 0)』で等値判定します。 |
| 負の値 | s1 が s2 より辞書順で前 | ソート比較関数の戻り値として使えます。 |
| 正の値 | s1 が s2 より辞書順で後 | ソート比較関数の戻り値として使えます。 |
サンプルコード
#include <stdio.h>
#include <string.h>
int main(void) {
// strcmp で等値判定します。
const char *s1 = "apple";
const char *s2 = "apple";
const char *s3 = "banana";
if (strcmp(s1, s2) == 0) {
printf("s1 と s2 は等しいです。\n"); // こちらが出力されます。
}
// 大小関係を確認します。
int cmp = strcmp(s1, s3);
if (cmp < 0) {
printf("%s は %s より辞書順で前です。\n", s1, s3);
// 『apple は banana より辞書順で前です。』と出力されます。
}
// strncmp で先頭 N 文字だけ比較します(コマンドのプレフィックス判定など)。
const char *cmd = "set_value";
if (strncmp(cmd, "set_", 4) == 0) {
printf("set_ で始まるコマンドです。\n"); // こちらが出力されます。
}
// 文字列配列を strcmp でソートする例です。
const char *fruits[] = {"cherry", "apple", "banana"};
int n = 3;
// バブルソートで比較します。
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (strcmp(fruits[j], fruits[j + 1]) > 0) {
const char *tmp = fruits[j];
fruits[j] = fruits[j + 1];
fruits[j + 1] = tmp;
}
}
}
printf("ソート後: ");
for (int i = 0; i < n; i++) printf("%s ", fruits[i]);
printf("\n"); // 『apple banana cherry』と出力されます。
return 0;
}
概要
『if (s1 == s2)』はポインタのアドレスを比較するため、同じ内容の文字列でも異なるアドレスにあれば false になります。文字列の内容を比較するには必ず strcmp() を使ってください。
比較はバイト値(unsigned char として)の大小で行われます。つまりアルファベット順とは異なる場合があり、特にマルチバイト文字(日本語など)のソートには使えません。ロケール対応の比較には strcoll() を使ってください。
汎用ソートへの応用は『qsort() / bsearch()』も参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。