C++ 为什么不一次打印完整字符串,而是一个字符一个字符地打印 #包括 使用名称空间std; int main() { 字符串str=“appleap”,str1; 对于(inti=0;i

C++ 为什么不一次打印完整字符串,而是一个字符一个字符地打印 #包括 使用名称空间std; int main() { 字符串str=“appleap”,str1; 对于(inti=0;i,c++,string,C++,String,,您可能希望使用str1.push_back(str[i]) 基本上,您的STR1以这样的方式作为字符数组工作,但不作为C++字符串对象。 Edt1:当您使用方括号访问STR1时,C++假定字符串已经具有覆盖该访问的分配大小,而不是在您的情况下。 所以,要么你把_向后推,要么先为str1保留一些大小 为什么str1在“xxxxxx”之后不打印 因为默认构造函数创建时该字符串为空 为什么在逐个字符访问str1时打印 因为您正在非法访问以前非法赋值的内存 要将std::string上的operat

,您可能希望使用str1.push_back(str[i])

<>基本上,您的STR1以这样的方式作为字符数组工作,但不作为C++字符串对象。

Edt1:当您使用方括号访问STR1时,C++假定字符串已经具有覆盖该访问的分配大小,而不是在您的情况下。 所以,要么你把_向后推,要么先为str1保留一些大小

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

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

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

因为您正在非法访问以前非法赋值的内存

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

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

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

#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;
}

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

由于
str1[i]=str[i]而导致的未定义行为;
,当
str1
为空时。与您的问题无关,但请阅读您可以将
for
循环替换为
str1=str;
,以复制字符串,并完全避免问题。@AlgirdasPreidžius:请将其作为答案。注释要求澄清等。@MSalters 1)已经有很多答案了——没有提供的用处,还有一个完全相同的答案。2)如果问题的答案仅限于一行,我认为这太简单了,无法保证答案的正确性。这并不能解释提问者为什么会接受这种行为,他确实如此。
for(int i=0;i<str.size();i++)
    str1[i]=str[i];
str1 = str;