C ++字符串未打印

时间:2014-03-10 17:12:59

标签: c++ string

我有下一个代码:

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]时,一切都很好。我不明白为什么?

5 个答案:

答案 0 :(得分:0)

newMessage为空std::string。对[i]执行操作会访问无效内存。字符串总是空的,你只是写入无效的内存。这是灾难的一个秘诀,你(幸运的是)它并没有让你崩溃。

我不确定message[i]是什么,但您可能希望newMessage[i] = message[i]。但您也可以跳过临时newMessage变量,然后打印出message[i]本身。

答案 1 :(得分:0)

newMessage是一个空字符串,因此不会打印任何内容。另外,std::cout是缓冲的,因此为了刷新缓冲区,您应该调用std::endlstd::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];