【发布时间】:2021-10-03 11:44:13
【问题描述】:
预期的输出是 1a1b1c 但我只得到 1a1b 如果我尝试在 for 循环中的 input.size() 旁边放置“-1”,但这只会忽略错误。我正在寻找的是我希望能够遍历字符串的最后一个成员而不会越界。
std::string input = "abc";
for (unsigned int i = 0; i < input.size(); i++){
int counter = 1;
while(input.at(i) == input.at(i+1) && i < input.size()-1){
counter++;
i++;
}
number.push_back(counter);
character.push_back(input.at(i));
}
【问题讨论】:
-
切换
while循环中的测试顺序,这样当i < input.size() - 1的测试失败时,您就不会尝试从i + 1读取。 -
你不能用开箱即用的 std::string 来做到这一点,它不包含尾随 0。所以在这种情况下它的大小确实是 3。(在调试器中尝试) .但是,您可以手动添加额外的 0:输入 += '\0';
-
@PepijnKramer: C++11 及更高版本
std::string确实自动持有\0终止符。但它不是报告大小的一部分。 -
@ShadowRanger 不,它没有,尾随零不需要在为 std::string 分配的内存中。如有必要,调用 c_str()、data() 或 const char* 运算符将附加它。 akrzemi1.wordpress.com/2014/03/20/strings-length
-
@PepijnKramer:您的链接不支持您所说的任何(它正确地说是C++ 字符串可以包含嵌入的NUL)。请参阅 the summary here:“指向
s[0]的指针可以传递给期望指向 [null 终止(C++11 起)]CharT[]数组的第一个元素的指针的函数。”或here, on StackOverflow, the same info。您正确地描述了 C++11 之前的工作方式。您对 C++11 及更高版本中标准的要求是 100% 错误的。