我在这个项目中没有UNICODE。这是一个WinAPI项目,变量“input”是一个字符串流,默认值为“0”。为什么第一个id语句运行而不是第二个,即使字符串本身是“0”?
void calc::AddToInput(int number)
{
MessageBox(NULL, input.str().c_str(), "Input", NULL); //Shows "0"
if(input.str().c_str() != "0") //Runs even though it shouldn't
{
input << number;
}
else if(input.str().c_str() == "0") //Doesn't run though it should
{
input.str("");
input << number;
}
}
答案 0 :(得分:18)
将C样式字符串与==
进行比较意味着“这些字符串的第一个元素是否具有相同的地址?”。它实际上并不比较字符串的内容。为此,您需要strcmp
。
但是,您没有理由比较C风格的字符串 - 只需使用std::string
返回的str()
,可以使用==
进行比较,如下所示:{{1} }。
答案 1 :(得分:5)
因为您需要比较指针,而不是字符串。比较字符串A)只需比较std::string
而不是c_str()
(最好),或B)使用strcmp
。
答案 2 :(得分:3)
这是一个指针比较。对于原始char*
比较,请使用strcmp
。 strcmp
如果不相等则返回-1或1,如果它们相等则返回0。
答案 3 :(得分:3)
input.str().c_str()
返回const char*
,它只是一个指针值,实际上是一些地址,如0x1233abcd。 “0”也是const char*
类型,它也是一个指针并且有一些地址即。 0x6533ab3d。当您执行比较时:
if(input.str()。c_str()!=“0”)
然后就像比较指针值(地址),所以它就像
if(0x1233abcd!= 0x6533ab3d)
你会一直得到真实的
答案 4 :(得分:2)
正如在if语句中已经说过的那样
if(input.str().c_str() != "0") //Runs even though it shouldn't
{
input << number;
}
比较字符串c_str()和字符串文字“0”的第一个元素的地址。由于他们有不同的地址,他们总是不平等,条件总是如此。
我认为你的意思是
if(input.str().c_str()[0] != '\0')
{
input << number;
}
答案 5 :(得分:0)
正如其他人所说,你正在比较原始char*
指针,它们具有不同的地址,因为它们来自不同的来源。要执行您正在尝试的操作,您需要使用std::string::operator==()
来比较std::string
的内容而不是比较指针(并且还要删除对std:stringstream::str()
的冗余调用,所有你正在做的就是浪费记忆的方式):
void calc::AddToInput(int number)
{
std::string str = input.str();
MessageBox(NULL, str.c_str(), "Input", NULL);
if (str == "0")
input.str("");
input << number;
}
或者,如果你也摆脱了MessageBox()
:
void calc::AddToInput(int number)
{
if (input.str() == "0")
input.str("");
input << number;
}