为什么完整的字符串不能一次打印,但是当我逐个字符地尝试打印时

时间:2018-08-24 13:17:35

标签: c++ string

unknownDf['Text']

输出为:
xxxxxx
appleap

为什么str1不能在“ xxxxxx”之后打印,但是为什么逐字符访问str1时为什么要打印?

有人可以帮助我吗?

3 个答案:

答案 0 :(得分:1)

也许您想使用str1.push_back(str [i])。

基本上,您的str1以此方式用作字符数组,而不是C ++字符串对象。

Edit1:当您使用方括号访问str1时,C ++假定字符串已经具有分配的大小来覆盖此访问,而您的情况并非如此。 因此,您可以push_back或先为str1保留一些大小。

答案 1 :(得分:1)

  

为什么str1不能在“ xxxxxx”之后打印?

因为在默认构造函数创建时该字符串为空。

  

为什么逐个字符访问str1时为什么要打印?

因为您非法访问了您之前分配了非法值的内存。

要将operator[]上的std::string与索引pos一起使用,则字符串大小必须至少为pos + 1,否则会出现不确定行为documenatation

  

返回对指定位置pos处字符的引用。不执行边界检查。如果pos> size(),则行为是不确定的。

在特殊情况下,pos == size()与您的情况无关。

答案 2 :(得分:0)

for(int i=0;i<str.size();i++)
    str1[i]=str[i];

operator[]上使用std::string时,不会检查要访问的索引是否正确。在此循环中,您尝试访问空字符串的元素,这是未定义的行为,意味着任何事情都可能发生。

如果您想复制std::string,只需使用operator=,就像这样

str1 = str;

str将复制str的内容,因此您不必手动进行操作。