Skip to content

strcmp — 文字列を比較する

TL;DR

ISO Cの strcmp(lhs, rhs) == 0 で文字列の一致を判定します。== は文字列の内容を比較しません。両方の引数が、有効なNULL終端文字列を指す必要があります。

Example

c
#include <stdio.h>
#include <string.h>

int main(void)
{
    char lhs[] = "hello";
    char rhs[] = "hello";
    if (strcmp(lhs, rhs) == 0) {
        puts("equal");
    }
    return 0;
}

Explanation

<string.h>strcmp の結果は次のように判定します。

戻り値意味
< 0lhsがrhsより前
== 0同じ内容
> 0lhsがrhsより後

順序は最初に異なる文字を unsigned char として比較して決まります。戻り値が必ず -11 になる保証はありません。日本語の辞書順や大文字・小文字を無視した比較ではありません。

Pitfalls

次は条件式の比較です。NGは先頭アドレスを比べてしまうので、別の配列に同じ文字列が入っていても一致を判定できません。

c
if (lhs == rhs) {
    /* 文字列の内容の一致には使えない */
}
c
if (strcmp(lhs, rhs) == 0) {
    /* 内容が一致 */
}

NULLと終端

NULLポインタや、終端まで安全に読めない領域を渡してはいけません。strncmp も「最大n文字まで同じか」を調べる関数なので、短いnでの一致を文字列全体の一致とみなせません。

参考

C11委員会草案 N1570 §7.24.4、§7.24.4.2。