虽然一些编译器的 C 库包含标准字符串函数的不区分大小写版本的扩展,例如 GNU 的 strcasestr(),但即使包含这些函数的命名也不是标准化的。
克服缺乏标准实现的一种方法当然是实现您自己的:
char* stristr( const char* str1, const char* str2 )
{
const char* p1 = str1 ;
const char* p2 = str2 ;
const char* r = *p2 == 0 ? str1 : 0 ;
while( *p1 != 0 && *p2 != 0 )
{
if( tolower( (unsigned char)*p1 ) == tolower( (unsigned char)*p2 ) )
{
if( r == 0 )
{
r = p1 ;
}
p2++ ;
}
else
{
p2 = str2 ;
if( r != 0 )
{
p1 = r + 1 ;
}
if( tolower( (unsigned char)*p1 ) == tolower( (unsigned char)*p2 ) )
{
r = p1 ;
p2++ ;
}
else
{
r = 0 ;
}
}
p1++ ;
}
return *p2 == 0 ? (char*)r : 0 ;
}
下面的测试代码输出:
Two Three
Two Three
NULL
cdefg
CDEFG
CdEfG
NULL
zzzz
NULL
zzzzz
NULL
int main(void)
{
char* test = stristr( "One TTwo Three", "two" ) ;
printf( "%s\n", test == 0 ? "NULL" : test ) ;
test = stristr( "One Two Three", "two" ) ;
printf( "%s\n", test == 0 ? "NULL" : test ) ;
test = stristr( "One wot Three", "two" ) ;
printf( "%s\n", test == 0 ? "NULL" : test ) ;
test = stristr( "abcdefg", "cde" ) ;
printf( "%s\n", test == 0 ? "NULL" : test ) ;
test = stristr( "ABCDEFG", "cde" ) ;
printf( "%s\n", test == 0 ? "NULL" : test ) ;
test = stristr( "AbCdEfG", "cde" ) ;
printf( "%s\n", test == 0 ? "NULL" : test ) ;
test = stristr( "1234567", "cde" ) ;
printf( "%s\n", test == 0 ? "NULL" : test ) ;
test = stristr( "zzzz", "zz" ) ;
printf( "%s\n", test == 0 ? "NULL" : test ) ;
test = stristr( "zz", "zzzzz" ) ;
printf( "%s\n", test == 0 ? "NULL" : test ) ;
test = stristr( "", "" ) ;
printf( "%s\n", test == 0 ? "NULL" : test ) ;
test = stristr( "zzzzz", "" ) ;
printf( "%s\n", test == 0 ? "NULL" : test ) ;
test = stristr( "", "zzzz" ) ;
printf( "%s\n", test == 0 ? "NULL" : test ) ;
test = stristr("AAABCDX","AABC") ;
printf( "%s\n", test == 0 ? "NULL" : test ) ;
return 0;
}