[PR]

大文字と小文字を区別しない文字列比較

戻る

//*********************************************************
// string1 と string2 を比較し、文字列の順序関係が
//   string1 == string2 であれば0を
//   string1 >  string2 であれば正を
//   string1 <  string2 であれば負を
// それぞれ返します。
// 関数 strcmpi() の返す順序関係と関数 strcmp() の返す順序関係とは一致しません。
// この関数は大文字と小文字を区別しません。
//*********************************************************
int 
strcmpi
	(
		const char *string1,
		const char *string2
	)
{
	// 最初の不一致文字を見つける。
	const char *p, *q;
	{for( p = string1, q = string2;
		tolower((unsigned char)*p) == tolower((unsigned char)*q);
		++p, ++q )
	{
		// 両文字列が終端に達した。
		if ( '\0' == *p )
		{
			return 0;
		}
	}}

	// 不一致文字間の大小関係を返す。
	return (unsigned char *)tolower((unsigned char)*p) > (unsigned char *)tolower((unsigned char)*q)
		? 1 : -1;
}//strcmpi
//*********************************************************
// string1 と string2 を最大で num 文字まで比較し、文字列の順序関係が
//   string1 == string2 であれば0を
//   string1 >  string2 であれば正を
//   string1 <  string2 であれば負を
// それぞれ返します。
// 関数 strncmpi() の返す順序関係と関数 strncmp() の返す順序関係とは一致しません。
// この関数は大文字と小文字を区別しません。
//*********************************************************
int 
strncmpi
	(
		const char   *string1,
		const char   *string2,
		      size_t  num
	)
{
	// 0 文字比較で不一致文字は見つからない。
	if ( 0 == num )
	{
		return 0;
	}

	// 最初の不一致文字を見つける。
	const char *p, *q;
	{for( p = string1, q = string2;
		tolower((unsigned char)*p) == tolower((unsigned char)*q);
		++p, ++q )
	{
		// 文字列が終端に達したか、指定文字数の比較が終了した。
		if ( ('\0' == *p) || (num-1 <= (size_t)(p - string1)) )
		{
			return 0;
		}
	}}

	// 不一致文字間の大小関係を返す。
	return (unsigned char *)tolower((unsigned char)*p) > (unsigned char *)tolower((unsigned char)*q)
		? 1 : -1;
}//strncmpi

関連

文字列末尾からの文字列検索
大文字と小文字を区別しない文字検索
大文字と小文字を区別しない文字列検索



Google
ご意見・ご感想をお聞かせ下さい。匿名で送信できます。

 * 返信が必要な場合には postmaster@katsura-kotonoha.sakura.ne.jp へ直接メールしてください。

水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
『新妻LOVELY×CATION』を応援しています!