[英]std::string resize is ruining compare operator (==)
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;
}
test1
是字符串"a\\0\\0\\0\\0\\0\\0\\0\\0\\0"
。 test2
是字符串"a"
。 他们不平等。
std::string
可以包含空字符。 它的长度不是到第一个空字符的距离。 它还可以确保包含字符串字符的内存缓冲区以超出其长度的其他空字符1结尾。
如果您不希望字符串更长,而只是想要内存,请使用std::string::reserve
。 请注意,您不能合法地使用[]
来访问末尾的元素,但是在您超过保留限制之前,后退或执行任何其他操作都不会导致任何新的内存分配。
这是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"
所以失败了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.