求助!关于C++ 字符串的问题

女友杨超越 2020-03-02 10:03:34
新人求助
#include<string>
#include<iostream>
using namespace std;
int main(){
string s1,s2,s3;
cin>>s1;
for(int i=0;i<s1.length();i++){
s2[i]=s1[i];
} //1
s3=s1.substr(0,s1.length()); //2
cout<<s2<<endl; //这种无法输s2
printf("%s\n",s2.c_str()); //可以输出s2
cout<<s3<<endl;
if(s1==s2) printf("yes\n");
else printf("no\n");
if(s1==s3) printf("yes\n");
else printf("no\n");
return 0;
}

我有几个疑问
1中我用类似于数组的方法for(int i=0;i<s1.length();i++){
s2[i]=s1[i];
}这种赋值的代码是否可行?因为在下面的判断里面s2!=s1
2的代码把s1赋给s3貌似可以得到s1==s3,请问大佬们c++字符串的赋值是用这种方式么?还是有什么一般的方法,新人不太懂
还有一个问题cout<<s2没有输出s2,但是c_str()后却可以输出,这是什么原因呢??
...全文
84 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
女友杨超越 2020-03-02
  • 打赏
  • 举报
回复
引用 1 楼 寻开心 的回复:
第一问 for(int i=0;i<s1.length();i++){ s2[i]=s1[i]; } 这样不行,因为s2的size还是0呢, 没有设定string的size就直接用下标访问,会出各种bug s2.resize(s1.size()) 这样之后才可以 第二问 实际上就是string的==判断和char *类型的字符串==判断的区别 string类型,可以用==来判断, 它判断的是连个字符串是否相同 char *类型的 == 判断的是两个指针是否相同,要判断字符串就要用 strcmp这个字符串比较函数 第三问: 和第一问相同的答案 因为s2没有resize的时候, 它的size大小就是0, 输出就空串 c_str()获取到是string的内部的char*类型的字符串的指针, s2[i]=s1[I]就是直接对它进行操作 总结 string 类型不是char *那样的简单的一个结构,它的结构更复杂 它包含了一个内部自己管理的char数组(或者叫做内存更合适) 以及一个长度数据,记录这个数组当中有效的字符的长度 string s2; 在定义这个变量都时候,默认就已经给s2的字符数组分配了一个空间了, 有效长度属性是0 此时直接s2[i]在i没有超过这个默认的数组大小的时候, 不会有显著的问题发生,可以赋值给他 但是此时的长度属性还是0, size方法返回这个长度就是0, cout它就是空串 c_str方法返回的是这个内部数组的地址, 因此你可以cout它出来 string当中的这个内部数组大小是可变的,当你用正确的方法增加string的长度超过已经分配的数组长度的时候, string会自动重新分配一个更长的内存来容纳,此时再c_str方法得到的地址就和以前的不一样了,所以c_str返回的地址要随用随取,不要保留,否则就有可能失效了 大体如此,详细的看string都说明去
哇,太感谢了!!
寻开心 2020-03-02
  • 打赏
  • 举报
回复
第一问
for(int i=0;i<s1.length();i++){
s2[i]=s1[i];
}
这样不行,因为s2的size还是0呢, 没有设定string的size就直接用下标访问,会出各种bug
s2.resize(s1.size()) 这样之后才可以

第二问
实际上就是string的==判断和char *类型的字符串==判断的区别
string类型,可以用==来判断, 它判断的是连个字符串是否相同
char *类型的 == 判断的是两个指针是否相同,要判断字符串就要用 strcmp这个字符串比较函数

第三问:
和第一问相同的答案
因为s2没有resize的时候, 它的size大小就是0, 输出就空串
c_str()获取到是string的内部的char*类型的字符串的指针, s2[i]=s1[I]就是直接对它进行操作

总结
string 类型不是char *那样的简单的一个结构,它的结构更复杂
它包含了一个内部自己管理的char数组(或者叫做内存更合适)
以及一个长度数据,记录这个数组当中有效的字符的长度
string s2; 在定义这个变量都时候,默认就已经给s2的字符数组分配了一个空间了, 有效长度属性是0
此时直接s2[i]在i没有超过这个默认的数组大小的时候, 不会有显著的问题发生,可以赋值给他
但是此时的长度属性还是0, size方法返回这个长度就是0, cout它就是空串
c_str方法返回的是这个内部数组的地址, 因此你可以cout它出来
string当中的这个内部数组大小是可变的,当你用正确的方法增加string的长度超过已经分配的数组长度的时候, string会自动重新分配一个更长的内存来容纳,此时再c_str方法得到的地址就和以前的不一样了,所以c_str返回的地址要随用随取,不要保留,否则就有可能失效了
大体如此,详细的看string都说明去

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧