文字列の比較

文字列操作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以外の値が返ってきた場合は一致しないことになります。

この関数の戻り値は、ふたつの文字列をアイウエオ順、ABC順に並べた時の前後の位置を意味します。
マイナス値が返ってきた場合は第一引数が順序が先、プラス値が返ってきた場合は第二引数のほうが順序が先という意味になります。
プラス値かマイナス値かだけに意味があり、数字の大きさには意味はありません。
(1が返ってきても10が返ってきても同じ)

strncmp関数

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文字目までは同じです。

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

大文字と小文字を無視した比較

strcmp(strncmp)関数は、アルファベットの大文字と小文字を別の文字と判断します。
「ABC」と「abc」を同じと判断したい場合には使えません。
このような比較を一発で行う関数はC言語標準関数には用意されていないので、自分で実装する必要があります。
実装のサンプルは大文字小文字の変換の項に掲載しています。

なお、C標準関数ではありませんが、コンパイラによってはstrcmpiという大文字小文字を無視した文字列比較関数が実装されている場合があります。
Visual Studioでは_strcmpiという名前で使用可能です。
「strncmpi」や「_strncmpi」はVisual Studioには存在しないようです。