首页新闻找找看学习计划

C++中用C语言的方式赋予字符串为嘛不行?

0
[已解决问题] 解决于 2012-04-10 16:14

string str1,str2;

cin>>str1;

int j=0;

for(int i=0;i!=str1.size();i++)

{

  str2[j++]=str1[i];

}

//str2[j]='\0';   这句话有没有都没反应;

cout<<str2<<endl;

 

不可以啊,而且 我还发现for()中的第一个分号前即把 int i=0 改为 string::size_type i=0,int j=0;就不可以了。

在C语言中一句话可以用逗号的吧?这是为什么呢???

爱的谜语的主页 爱的谜语 | 初学一级 | 园豆:187
提问于:2012-03-30 23:16
< >
分享
最佳答案
1

std::string不是C字符串

对于std::string s;来说
访问s[i]的时候,要保证  0<=i<s.size();

对于上面的str2来说,size是0。
应该使用
str2.append(str1[i]); 或者 str2 += str1[i];

奖励园豆:5
Greatest | 小虾三级 |园豆:678 | 2012-03-31 16:09
其他回答(2)
1

1:string的内存是动态分配,但不是完全自动分配,不要这样操作str2[j++]=str1[i]; str2[j]='\0';访问很容易越界出现错误。

2:尽量不要采用后缀++的方式,使用前置++效率高一些

zsounder | 园豆:2819 (老鸟四级) | 2012-03-31 02:18

谢谢!

动态分配为什么就不能str2[j++]=str1[i]; str2[j]='\0';这么操作了呢? 难道C++中的字符名不是一个数组?或者其内存空间不连续?

2.我看的C语言的书全采用后缀++, C++的书采用前缀++,一直不知其解,烦劳指教下其中的区别~ 谢谢!

支持(0) 反对(0) 爱的谜语 | 园豆:187 (初学一级) | 2012-03-31 08:59

@爱的谜语: C++中的string是一个类,不是数组,因为重载了[]操作符,所以可以使用类似数组的方式(下标)访问元素。

2.后缀++和前缀++在一般情况下对操作数的值没有什么差别,只是一个是先使用后+1,一个是先+1后使用。对于效率问题,无非一个没有值的拷贝,一个有值的拷贝,效率上的差别很细微。

支持(0) 反对(0) Simbon | 园豆:209 (菜鸟二级) | 2012-04-02 07:32

@Simbon: 还是做做大量的测试再说吧。

支持(0) 反对(0) zsounder | 园豆:2819 (老鸟四级) | 2012-04-02 10:25

@爱的谜语: 后缀++要产生临时变量,大量循环操作的时候,你可以想象一下会怎样。编译器可以做一些优化,但是只是对于简单的情况,对于复杂的迭代器交给编译器去处理这些事情是不明智的。

支持(0) 反对(0) zsounder | 园豆:2819 (老鸟四级) | 2012-04-02 10:29
0

cout<<str2[0]<<endl;先想明白这句代码为何会越界。

Rollen Holt | 园豆:210 (菜鸟二级) | 2012-05-02 12:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册