文字列の比較

文字列操作4

配列に保存されている文字列が他の文字列と同じかどうかを比較するにはstrcmp関数strncmp関数を使用します。

strcmp関数

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

int main()
{
	const char str1[] = "ABC";
	const char str2[] = "ABC";
	const char str3[] = "DEF";

	printf("str1とstr2は");
	if (strcmp(str1, str2) == 0)
		printf("同じです。\n");
	else
		printf("同じではありません。\n");	

	printf("str1とstr3は");
	if (strcmp(str1, str3) == 0)
		printf("同じです。\n");
	else
		printf("同じではありません。\n");

	getchar();
}
str1とstr2は同じです。
str1とstr3は同じではありません。
int strcmp(
 const char *string1,
 const char *string2
);
string1とstring2を比較し、同じならば0を返す。
string1のほうが小さければ-1以下を返す。
string1のほうが大きければ1以上を返す。

引数に指定した二つの文字列が一致した場合、strcmp関数は0を返します。
これを利用して、サンプルコード10行目ではif文でstrcmpの実行結果と0とを比較し、文字列同士が一致するかどうかをチェックしています。
0以外の値が返ってきた場合は一致しないことになります。

戻り値が-1以下や1以上というのは文字数ではなく、アイウエオ順、ABC順に並べた時にどちらが先になるかを示します。
マイナス値が返ってきた場合、第一引数の方が先に並ぶことを意味します。
サンプルコードでは一致するか否かだけ分かればいいので、0かそれ以外かだけをチェックしています。

strncmp関数

strcmp関数は文字列のコピー動作をしないのでセキュリティリスクがありません。
なのでセキュア版(_s系)の関数はありません。
(不正な文字列を与えるとバッファオーバーランが発生するのはどの関数でも同じです)

strncmp関数はセキュリティのためではなくチェックする文字数を制限するために使用します。

int strncmp(
 const char *string1,
 const char *string2,
 size_t count
);
string1とstring2をcount文字目まで比較し、同じならば0を返す。
string1のほうが小さければ-1以下を返す。
string1のほうが大きければ1以上を返す。
#include <stdio.h>
#include <string.h>

int main()
{
	const char str1[] = "ABCDE";
	const char str2[] = "ABCZ";

	printf("str1とstr2は3文字目までは");
	if (strncmp(str1, str2, 3) == 0)
		printf("同じです。\n");
	else
		printf("同じではありません。\n");	

	getchar();
}
str1とstr2は3文字目までは同じです。

このコードのstr1とstr2では別の文字列が入っていますが、3文字目までは同じです。
このような場合、strncmp関数の第三引数に3以下の値を指定すると一致する結果を返します。