我想做一个小文本冒险来获得C++的句柄。比较std :: string与常量vs比较字符数组与常量在C++
cin >> keyboard1;
if ((keyboard1 == "inv")inventory(inv);
这将工作,如果keyboard1是一个字符串,但不会,如果它是一个字符数组,这是因为我还没有包括在恒定的末尾空?
我想做一个小文本冒险来获得C++的句柄。比较std :: string与常量vs比较字符数组与常量在C++
cin >> keyboard1;
if ((keyboard1 == "inv")inventory(inv);
这将工作,如果keyboard1是一个字符串,但不会,如果它是一个字符数组,这是因为我还没有包括在恒定的末尾空?
Let'say你的代码如下:
int main(int argc, char *argv[])
{
std::string s;
std::cin >> s;
std::cout << s << std::endl;
if (s == "inv") {
std::cout << "Got it" << std::endl;
}
return 0;
}
可正常工作的,因为STL类string
覆盖==
操作的方式。
你不能指望下面的代码,而不是工作:
int main(int argc, char *argv[])
{
char *s = (char *)calloc(10, sizeof(char));
std::cin >> s;
std::cout << s << std::endl;
if (s == "inv") {
std::cout << "Got it" << std::endl;
}
return 0;
}
因为你所在的字符串开始一个常量字符串(其中,顺便说一句,自动空值比较s,这是地址由编译器终止)。
您应该使用的strcmp比较 “C字符串”:
int main(int argc, char *argv[])
{
char *s = (char *)calloc(10, sizeof(char));
std::cin >> s;
std::cout << s << std::endl;
if (strcmp(s, "inv") == 0) {
std::cout << "Got it" << std::endl;
}
return 0;
}
这工作。
不,它不起作用的原因是因为你会比较表示每个字符串的内存地址。改为使用strcmp
/wcscmp
。
比较字符串和常量的原因是因为字符串类将定义一个相等运算符(例如bool StringClass:operator==(const char* pszString)
)。
如果keyboard1
是一个char数组,则if (keyboard1 == "inv")
正在执行一个简单的指针比较(都变成char*
)。
当keyboard1
是一个字符串,它可以调用一个operator==(cosnt string&, const char*)
如果存在,否则,如果字符串具有非显式构造string(const char *s)
,常数"inv"
将被隐式转换为字符串对象,并应用于operator==(const string&,const string&)
。
感谢您的编辑。我缩进了四个空格,之前已经工作了...... – Hagbard 2011-05-15 12:50:38