Я могу задать глупый вопрос, но я действительно не могу найти ответ с Google, плюс я все еще начинаю использовать MSVS.
Мне недавно нужно было использовать функции для сравнения двух строк. Чего я не понимаю, так это разницы между stricmp и _stricmp. Оба они могут быть использованы для сравнения строк и получения одинаковых результатов. Я пошел, чтобы проверить их:
char string1[] = "The quick brown dog jumps over the lazy fox";
char string2[] = "The QUICK brown dog jumps over the lazy fox";
void main( void )
{
char tmp[20];
int result;
/* Case sensitive */
printf( "Compare strings:\n\t%s\n\t%s\n\n", string1, string2 );
result = stricmp( string1, string2 );
if( result > 0 )
strcpy( tmp, "greater than" );
else if( result < 0 )
strcpy( tmp, "less than" );
else
strcpy( tmp, "equal to" );
printf( "\tstricmp: String 1 is %s string 2\n", tmp );
/* Case insensitive */
result = _stricmp( string1, string2 );
if( result > 0 )
strcpy( tmp, "greater than" );
else if( result < 0 )
strcpy( tmp, "less than" );
else
strcpy( tmp, "equal to" );
printf( "\t_stricmp: String 1 is %s string 2\n", tmp );
}
Результат показывает, что они одинаковы:
Compare strings:
The quick brown dog jumps over the lazy fox
The QUICK brown dog jumps over the lazy fox
stricmp: String 1 is equal to string 2
_stricmp: String 1 is equal to string 2
Мне интересно, почему …
stricmp
это функция POSIX, а не стандартная функция C90. Чтобы избежать конфликта имен, Microsoft не одобряет несоответствующее имя (stricmp
) и рекомендует использовать _stricmp
вместо. Там нет разницы в функциональности (stricmp
это просто псевдоним для _stricmp
.)
Для многих библиотечных функций, включая все <string.h>
функции, подчеркиваемые версии с префиксами являются / были идеей Microsoft о чем-то. Я не помню точно, что.
Версия без подчеркивания является очень переносимой. Код, который использует _stricmp()
, _strcpy()
и т. д. должны быть как-то обработаны — редактировать, #defined
и т. д. — если код будет обработан другим компилятором.