我正在尝试制作一个小型的文字冒险游戏,以掌握C ++。
cin >> keyboard1;
if ((keyboard1 == "inv")inventory(inv);
如果keyboard1是一个字符串,那么这将起作用;但如果它是一个字符数组,则不会,这是因为我没有在常量末尾包含null吗?
假设你的代码如下:
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与常量字符串进行比较(顺便说一下,这个字符串由编译器自动以null结尾)。
你应该使用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;
}
这是有效的。
keyboard1
是一个字符数组,那么 if (keyboard1 == "inv")
就是执行一个简单的指针比较(两者都变成了 char*
)。keyboard1
是一个字符串时,它可以调用一个 operator==(cosnt string&, const char*)
(如果存在的话),否则,如果该字符串具有非显式构造函数 string(const char *s)
,常量 "inv"
将被隐式转换为一个字符串对象,并应用 operator==(const string&,const string&)
。