不打印c++字符串
C++ string not printed
我有下一个代码:
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]
,一切都好。我不明白为什么?
newMessage
为空std::string
。对它执行[i]
是访问无效内存。字符串总是空的,你只是在写无效的内存。这是一个灾难的配方,你(不)幸运的是它没有撞到你。
我不确定message[i]
是什么,但你可能想要newMessage[i]
= message[i]
。但是您不妨跳过临时的newMessage
变量,直接打印出message[i]
本身。
newMessage
是一个空字符串,因此不会打印任何内容。此外,std::cout
是缓冲的,因此为了刷新缓冲区,您应该调用std::endl
或std::flush
我宁愿从这改变:
newMessage[i] = message[i];
:
newMessage += message[i];
打印时:
std::cout << newMessage<<std::endl;
在空字符串上使用[i]是自找麻烦,因为您的输入超出了绑定内存。有时它什么也做不了,有时你的程序会崩溃。
正如corn秸秆所说,您有越界访问权限。
更重要的是,代码对于任务来说太复杂了。不要使用手动循环将一个std::string
部分复制到另一个。要将message
的一部分复制到newMessage
,在message
上使用substr
并分配:
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));
使用该字符串作为newMessage[i]
意味着它是字符串数组。将这一行替换为std::string newMessage[textCapacity];