表示テーマ
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 の結果は次のように判定します。
| 戻り値 | 意味 |
|---|---|
< 0 | lhsがrhsより前 |
== 0 | 同じ内容 |
> 0 | lhsがrhsより後 |
順序は最初に異なる文字を unsigned char として比較して決まります。戻り値が必ず -1 や 1 になる保証はありません。日本語の辞書順や大文字・小文字を無視した比較ではありません。
Pitfalls
次は条件式の比較です。NGは先頭アドレスを比べてしまうので、別の配列に同じ文字列が入っていても一致を判定できません。
c
if (lhs == rhs) {
/* 文字列の内容の一致には使えない */
}c
if (strcmp(lhs, rhs) == 0) {
/* 内容が一致 */
}NULLと終端
NULLポインタや、終端まで安全に読めない領域を渡してはいけません。strncmp も「最大n文字まで同じか」を調べる関数なので、短いnでの一致を文字列全体の一致とみなせません。
Related
参考
C11委員会草案 N1570 §7.24.4、§7.24.4.2。