Для сравнения любых строк без учета их регистра существуют различные библиотечные функции C, такие как strcasecmp()
, stricmp()
и stricmpi()
. В чем разница между ними?
Почему существует несколько функций C для сравнения без учета регистра
Ответы (4)
Есть несколько способов сделать многое, прежде всего потому, что процесс стандартизации отстает от реализации. Люди видят потребность в функции (в данном случае — сравнение строк без учета регистра), и некоторые разработчики компиляторов/библиотеки реализуют функцию с именем strcmpi
, в то время как другая группа реализует stricmp
, в то время как другая группа решает, что нет необходимости ее реализовывать, в то время как другая группа группа реализует strcasecmp
, а другая группа реализует strcmpnocase
и т. д. Годы спустя представители разных групп встречаются в смертельной схватке, и реализация победителя становится частью языка. Между тем, другие реализации продолжают использовать методы с другими именами, и язык становится сильнее/фрагментируется/раздувается (в зависимости от вашей точки зрения).
Ни stricmp()
, ни strcmpi()
не описаны в стандарте C99 (или POSIX.1-2008).
Стандартный способ сравнения строк без учета регистра состоит в том, чтобы преобразовать обе строки в нижний (или в верхний) регистр перед использованием strcmp()
.
Функция POSIX: strcasecmp()
.
Оба являются нестандартными расширениями, то есть не являются частью «языка C» (который указан в ISO/IEC 9899).
strcmpi()
упоминается как устаревший в MSDN, ошибочно называя его "функцией POSIX". " и ссылаясь на _stdicmp
как на замену (что лишь незначительно лучше).
stricmp()
упоминается как популярный в Википедии, но, тем не менее, нестандартный.
Вы должны понимать, что любая реализация библиотеки может предоставлять дополнительные функции. Подобно open()
и read()
, OpenFile()
, AllocMem()
и т. д. и т. д. — ни один из них не является «языком C», просто реализован в C, работает на одной или нескольких платформах, но не обязательно доступен на других.
read
и open
не являются частью стандарта C, но они являются частью надмножества POSIX. Правильно называть их нестандартными, но их использование не так небезопасно или непереносимо, как некоторые другие нестандартные функции (например, clone
или sys_clone
).
- person Elias Van Ootegem; 26.05.2014
int strcmpi(const char *s1, const char *s2);
int stricmp(const char *s1, const char *s2);
strcmpi (реализованный как макрос, вызывающий stricmp) выполняет беззнаковое сравнение s1 с s2 без учета регистра. strcmpi выполняет беззнаковое сравнение s1 с s2 без учета регистра.
Чтобы использовать strcmpi
, вы должны включить STRING.H
. Этот макрос предназначен для совместимости с другими компиляторами C.