为什么不是“0”==“0”?

时间:2014-01-27 20:40:57

标签: c++ winapi stringstream

我在这个项目中没有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;
    }
}

6 个答案:

答案 0 :(得分:18)

将C样式字符串与==进行比较意味着“这些字符串的第一个元素是否具有相同的地址?”。它实际上并不比较字符串的内容。为此,您需要strcmp

但是,您没有理由比较C风格的字符串 - 只需使用std::string返回的str(),可以使用==进行比较,如下所示:{{1} }。

答案 1 :(得分:5)

因为您需要比较指针,而不是字符串。比较字符串A)只需比较std::string而不是c_str()(最好),或B)使用strcmp

答案 2 :(得分:3)

这是一个指针比较。对于原始char*比较,请使用strcmpstrcmp如果不相等则返回-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;
}