std :: string调整大小破坏了比较运算符(==)

时间:2018-12-06 20:15:03

标签: c++ string compare

std :: string调整大小会导致看起来相等的字符串不再相等。当我将鼠标悬停在调试器中的变量上时,它们似乎具有相同的值,这可能会引起误解。

我认为可以归结为我希望==运算符在第一个空字符处停止,但是一直持续到大小结尾。我确定这可以按预期工作,但是我在此问题上停留了一段时间,所以我想看看为什么即使在第一个空字符之后也要继续比较字符。谢谢!

int main(void)
{
    std::string test1;
    test1.resize(10);
    test1[0] = 'a';

    std::string test2 = "a";

    //they are not equal
    bool same = (test1 == test2);

    return 0;
}

2 个答案:

答案 0 :(得分:6)

test1是字符串"a\0\0\0\0\0\0\0\0\0"test2是字符串"a"。他们不平等。

std::string可以包含空字符。它的长度不是到第一个空字符的距离。它还可以确保包含字符串字符的内存缓冲区以超出其长度的其他空字符1结尾。

如果您不希望字符串更长,而只是想要存储,请使用std::string::reserve。请注意,您不能合法地使用[]访问末尾的元素,但是在您超过保留限制之前,后退或执行任何其他操作都不会导致任何新的内存分配。

答案 1 :(得分:3)

这是std::string的预期行为。与C字符串不同,std::string可以具有任意多个空字符。例如,将"this\0 is\0 a\0 legal\0 std::string\0"作为std::string的内容是合法的。您必须像这样构建它

std::string nulls_inside("this\0 is\0 a\0 legal\0 std::string\0", sizeof("this\0 is\0 a\0 legal\0 std::string\0");

,但是您也可以在现有的std::string中插入空字符。您正在比较

"a\0\0\0\0\0\0\0\0\0\0"

反对

"a\0"

所以失败了。