Ответ 1
Попробуйте strcasecmp()
. Здесь справочная страница. Он соответствует 4.4BSD и POSIX.1-2001.
Я пытаюсь скомпилировать следующий очень простой фрагмент исходного кода:
#include <cstring>
// #include <string.h>
// using namespace std;
class Helper {
public:
int cStringsAreEqual(const char *s1, const char *s2) {
return stricmp(s1, s2);
}
};
... но я получаю следующее сообщение об ошибке:
g++ error: ‘stricmp’ was not declared in this scope
Однако, когда я использую strcmp() вместо stricmp(), тогда все в порядке!
Что здесь может быть неправильным? Должна ли разрешаться функция stricmp() при разрешении strcmp()?
Sureley, все это можно было бы написать гораздо лучше, не используя strcmp/stricmp.
Но это не главное.
Я переношу часть программного обеспечения, которое широко использует вызовы stricmp(). И если возможно, я хотел бы избежать всех усилий, необходимых для изменения каждого вызова stricmp.
Любая помощь по этому поводу будет очень оценена!
BTW: Я использую кармическую ОС Ubuntu (v9.10) с g++ v4.4.1.
Кстати: как вы можете видеть, я также провел несколько испытаний с "#include string.h" или с "namespace std", но ничего не помогло.
Попробуйте strcasecmp()
. Здесь справочная страница. Он соответствует 4.4BSD и POSIX.1-2001.
stricmp
не является ни POSIX, ни ANSI, поэтому не имеет значения, разрешено ли strcmp
, если ваш компилятор или стандартный библиотека строго придерживается стандартных функций библиотеки POSIX или ANSI (как это, вероятно, имеет место с пакетом GCC).
Добавьте определение для его перезаписи stricmp с помощью strcasecmp на тех платформах, которые вы ищете.
#ifdef _IPHONE <- your platform define here
#define stricmp strcasecmp
#define strnicmp strncasecmp
#endif
Тогда вы можете просто использовать stricmp всегда.
Довольно легко сделать свой собственный, если потребуется...
int my_stricmp (const char *s1, const char *s2)
{
while (*s1 != 0 && *s2 != 0)
{
if (*s1 != *s2 && ::toupper (*s1) != ::toupper(*s2))
{
return -1;
}
s1++;
s2++;
}
return (*s1 == 0 && *s2 == 0) ? 0 : -1;
}