不打印c++字符串

C++ string not printed

本文关键字:字符串 c++ 打印      更新时间:2023-10-16

我有下一个代码:

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::endlstd::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];