我正在尝试进行一些文本冒险以掌握C ++。
cin >> keyboard1;
if ((keyboard1 == "inv")inventory(inv);
如果keyboard1是一个字符串,这将有效,但如果它是一个char数组则不会这样,这是因为我没有在常量的末尾包含null吗?
答案 0 :(得分:3)
我们的代码如下:
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-strings”:
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;
}
这很有效。
答案 1 :(得分:2)
不,它不起作用的原因是因为您将比较代表每个字符串的内存地址。请改用strcmp
/ wcscmp
。
比较字符串和常量工作的原因是因为字符串类将定义相等运算符(例如bool StringClass:operator==(const char* pszString)
)。
答案 2 :(得分:0)
如果keyboard1
是char数组,那么if (keyboard1 == "inv")
正在执行简单的指针比较(都变为char*
)。
当keyboard1
是一个字符串时,它可以调用operator==(cosnt string&, const char*)
(如果存在),否则,如果字符串具有非显式构造函数string(const char *s)
,则常量"inv"
将被隐式转换为字符串对象,并operator==(const string&,const string&)
已应用。