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

why complete string is not printing at once but when i try character by character its printing

本文关键字:打印 字符 一次 字符串 为什么      更新时间:2023-10-16
#include<bits/stdc++.h>
using namespace std;
int main ()
{
string str="appleap",str1;
for(int i=0;i<str.size();i++)
str1[i]=str[i];
cout<<"xxxxxx  "<<str1<<endl;
cout<<str1[0]<<str1[1]<<str1[2]<<str1[3]<<str1[4]<<str1[5]<<str1[6]<<endl;
}

输出是:
xxxxxxx
苹果

为什么str1 在"xxxxxxx"之后不打印,但为什么在逐个字符访问 str1 时打印?

谁能帮我?

为什么 str1 在 "xxxxxx" 之后不打印

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

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

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

要在具有索引posstd::string上使用operator[],字符串大小必须至少为 pos+1,否则您将获得未定义的行为文档

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

pos == size()时有特殊情况,但这与您的情况无关。

可能你想改用str1.push_back(str[i](。

基本上,str1 以这种方式用作字符数组,但不是C++字符串对象。

Edit1:当您使用方括号访问str1时,C++假设字符串已经具有涵盖此访问权限的分配大小,但这种情况并非如此。 所以要么你push_back,要么先为 str1 保留一些大小。

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

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

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

str1 = str;

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