为什么完整的字符串没有一次打印,但是当我尝试逐个字符打印时
why complete string is not printing at once but when i try character by character its printing
#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 时要打印?
因为您非法访问以前非法分配值的内存。
要在具有索引pos
的std::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
的内容,因此您不必手动执行此操作。
相关文章:
- 打印字符数组地址的正确方法
- c ++控制台应用程序,如何在控制台外部打印字符
- 无法使用 swprintf 在 WCHAR* 中打印字符*
- 存储和打印字符,但输出不是预期的
- 如何使 printf 以与 NSLog 相同的方式打印字符缓冲区?
- 在带有 (void*) 强制转换的字符串中打印字符的内存地址
- C++无法打印字符变量
- 无法打印字符向量C++向量
- 为什么在编辑 fastq 文件并将输出写入新的 fastq 文件时引入不可打印字符?
- C :如何询问文件名并打印字符数组
- 循环中的 Cout 不会按定义的字符逐个打印字符
- (C++) 打印字符数组字符串的单词时出现问题
- 用putchar在屏幕上打印字符
- 在C 中使用继续语句的打印字符
- 在 for 循环 c++ 中打印字符
- 使用while和if递归打印字符
- 打印字符数组 c++
- 如何使用Xcode中的Unicode打印字符╔(和其他字符)
- cout.put() 是否推荐使用 cout<< 打印字符
- C++ 中的密码 |打印字符后删除字符