我正在尝试编译以下非常简单的源代码:
#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()时,一切都很好!
这里有什么不对?当strcmp()被允许时,是否应该允许stricmp()?
但这不是重点。
我正在移植一个软件 - 它大量使用了对stricmp()的调用。如果可能的话,我想避免所有改变每次调用stricmp所需的努力。
非常感谢任何帮助!
BTW:我正在使用Ubuntu karmic OS(v9.10)和g ++ v4.4.1。
顺便说一句:正如你所看到的,我也用'#include string.h'或'namespace std'进行了一些试验,但没有任何帮助。答案 0 :(得分:35)
试试strcasecmp()
。这是它的manual page。它符合4.4BSD和POSIX.1-2001。
答案 1 :(得分:14)
stricmp
is neither POSIX nor ANSI,如果您的编译器或标准库严格遵守POSIX或ANSI标准库函数,则允许strcmp
并不重要(GCC可能就是这种情况)套件)。
答案 2 :(得分:11)
为它添加一个定义,用你要查找的平台上的strcasecmp覆盖stricmp。
#ifdef _IPHONE <- your platform define here
#define stricmp strcasecmp
#define strnicmp strncasecmp
#endif
然后你可以一直使用stricmp。
答案 3 :(得分:-1)
如果需要,很容易制作自己的......
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;
}
答案 4 :(得分:-1)
如果您拥有Boost,请在boost::algorithm::iequals(s1, s2, std::locale::classic())
中使用<boost/algorithm/string/predicate.hpp>
(或者,如果您希望对语言环境敏感,请不要使用语言环境)。它适用于C字符串,std::[w]string
,vector<char>
等。