Почему существует несколько функций C для сравнения без учета регистра

Для сравнения любых строк без учета их регистра существуют различные библиотечные функции C, такие как strcasecmp(), stricmp() и stricmpi(). В чем разница между ними?


person userrp1519825    schedule 26.05.2014    source источник
comment
См. также: stackoverflow.com/q/9618697/2372604   -  person ilent2    schedule 26.05.2014
comment
Я сделал это сам сейчас (если редактирование принято)   -  person PJTraill    schedule 04.09.2015


Ответы (4)


Есть несколько способов сделать многое, прежде всего потому, что процесс стандартизации отстает от реализации. Люди видят потребность в функции (в данном случае — сравнение строк без учета регистра), и некоторые разработчики компиляторов/библиотеки реализуют функцию с именем strcmpi, в то время как другая группа реализует stricmp, в то время как другая группа решает, что нет необходимости ее реализовывать, в то время как другая группа группа реализует strcasecmp, а другая группа реализует strcmpnocase и т. д. Годы спустя представители разных групп встречаются в смертельной схватке, и реализация победителя становится частью языка. Между тем, другие реализации продолжают использовать методы с другими именами, и язык становится сильнее/фрагментируется/раздувается (в зависимости от вашей точки зрения).

person William Pursell    schedule 26.05.2014
comment
Это забавный фон, но ответ @pmg хоть и имеет меньше голосов, но значительно информативнее. - person PJTraill; 04.09.2015

Ни stricmp(), ни strcmpi() не описаны в стандарте C99 (или POSIX.1-2008).

Стандартный способ сравнения строк без учета регистра состоит в том, чтобы преобразовать обе строки в нижний (или в верхний) регистр перед использованием strcmp().

Функция POSIX: strcasecmp().

person pmg    schedule 26.05.2014
comment
C 2011 также не имеет функций сравнения без учета регистра. - person PJTraill; 04.09.2015

Оба являются нестандартными расширениями, то есть не являются частью «языка C» (который указан в ISO/IEC 9899).

strcmpi() упоминается как устаревший в MSDN, ошибочно называя его "функцией POSIX". " и ссылаясь на _stdicmp как на замену (что лишь незначительно лучше).

stricmp() упоминается как популярный в Википедии, но, тем не менее, нестандартный.

Вы должны понимать, что любая реализация библиотеки может предоставлять дополнительные функции. Подобно open() и read(), OpenFile(), AllocMem() и т. д. и т. д. — ни один из них не является «языком C», просто реализован в C, работает на одной или нескольких платформах, но не обязательно доступен на других.

person DevSolar    schedule 26.05.2014
comment
Просто для полноты: да, read и open не являются частью стандарта C, но они являются частью надмножества POSIX. Правильно называть их нестандартными, но их использование не так небезопасно или непереносимо, как некоторые другие нестандартные функции (например, clone или sys_clone). - person Elias Van Ootegem; 26.05.2014
comment
@EliasVanOotegem В MS DOS были функции read() и open(). Вероятно, они существовали и в Unix. Возможно с другими параметрами. Поскольку эти операционные системы определенно старше POSIX, эти функции уже существовали до того, как POSIX стал стандартом ISO. POSIX зарезервировал многие вещи, которые уже существовали в нескольких версиях. Я определенно не стал бы предполагать, что функции переносимы или безопасны только потому, что они являются частью POSIX. - person Lundin; 26.05.2014
comment
@EliasVanOotegem: вопрос точки зрения. У меня есть несколько проблем с POSIX, обещаемой им переносимостью и типами ограничений, которые соответствие POSIX накладывает на разработчика OS API. Но это очень много ОТ для этого вопроса или вопросов и ответов в целом. Я придерживаюсь формулировки своего поста. - person DevSolar; 26.05.2014
comment
@lundin: я не хотел провозглашать, что POSIX гарантирует абсолютную переносимость (это не так), я просто хотел расставить точки над i и зачеркнуть t, сказав, что эти функции должны быть доступны в POSIX-совместимых системах. - person Elias Van Ootegem; 26.05.2014
comment
@EliasVanOotegem: я очень надеюсь, что они доступны в POSIX-совместимых системах, иначе система не будет совместима, не так ли? ;-) - person DevSolar; 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.

person Community    schedule 26.05.2014
comment
Что вы имеете в виду под "без подписи"? - person PJTraill; 04.09.2015