While some C compiler libraries have extensions with case-insensitive versions of standard string functions, such as GNU strcasestr() , naming such functions is not standardized even when turned on.
One way to overcome the lack of a standard implementation is, of course, to implement your own:
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 ; }
Below is the test code:
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; }