我有下一个代码:
void addContent ( const std::string& message ) {
std::string newMessage;
for ( int i = 0, remainder = textCapacity - currentText; i < remainder; i++ ) {
newMessage[i] = message[i];
std::cout << newMessage; //here nothing is printed
}
}
但没有印刷。
只有当我将newMessage
更改为newMessage[i]
时,一切都很好。我不明白为什么?
答案 0 :(得分:0)
newMessage
为空std::string
。对[i]
执行操作会访问无效内存。字符串总是空的,你只是写入无效的内存。这是灾难的一个秘诀,你(幸运的是)它并没有让你崩溃。
我不确定message[i]
是什么,但您可能希望newMessage[i]
= message[i]
。但您也可以跳过临时newMessage
变量,然后打印出message[i]
本身。
答案 1 :(得分:0)
newMessage
是一个空字符串,因此不会打印任何内容。另外,std::cout
是缓冲的,因此为了刷新缓冲区,您应该调用std::endl
或std::flush
答案 2 :(得分:0)
我宁愿改变:
newMessage[i] = message[i];
到此:
newMessage += message[i];
打印时:
std::cout << newMessage<<std::endl;
在空字符串上使用[i]正在寻找麻烦,因为您输入的无效超出内存。有时它会在你的程序崩溃时无所作为。
答案 3 :(得分:0)
正如Cornstalks所说,你有一个越界的访问权。
更重要的是,代码对于任务而言过于复杂。不要使用手动循环将一个std::string
部分复制到另一个message
。要将newMessage
的一部分复制到substr
,请在message
上使用newMessage = message.substr(from_index, number_of_chars);
并指定:
std::string newMessage(message.begin() + from_index, message.begin() + to_index);
或基于迭代器的东西:
std::string newMessage(message.begin(), message.begin() + (textCapacity - currentText));
后者效率更高。所以你想要
{{1}}
答案 4 :(得分:0)
将该字符串用作newMessage[i]
意味着它是一个字符串数组。将该行替换为std::string newMessage[textCapacity];
。