c++字符串数组与字符串指针 c++ primer plus chapter 7 复习题8 的一点小问题

来源:互联网 发布:电脑配音软件 编辑:程序博客网 时间:2024/06/14 04:17


最近再看c++ primer plus ,做第7章复习题8时,发现自己写的与答案不一样,就顺便调试试了下,发现答案也是有问题的:


原题是:编写一个函数,把其中某一个字符都用另一个字符替换


贴出来代码,写起来还是很容易的

#include<iostream>
#include<string>
int replace(char str[],char c1,char c2);
using namespace std;
int main()
{
//char *wail="luualut";  //  @1
char wail[]="luualut";   // @2
cout<<wail<<endl;
int n=replace(wail,'u','c');
cout<<wail;
cin.get();
}


int replace(char *str,char c1,char c2)
{
int n=strlen(str);

int count=0;
for(int i=0;i<n;i++)
//while(*str)
{
if(*str==c1)
{
*str =c2;  //@3
count++;
}
str++;
}
return count;
}

函数声明的时候证实不论用字符串指针,或数组是一样的,当然这与书上的是一样的,但当主函数中用@1时 编译成功,运行就会出现写入错误,就会卡在@3处,找了很多说是指针指向空的等等,但都没有明白,也改不过来,后来看到http://blog.sina.com.cn/s/blog_4c70701801015n3t.html这篇博客才稍微明白点,声明指针字符串常量的时候,左边的变量是在栈中的,右边的字符串常量是在堆中,是不可更改的,所以当我们想更改里面的字符时就会出现写入错误,换成数组的定义方式,即@2的方式,就可以了,因为数组定义方式,左右都是在栈中,是可以修改的,更深的原因还是没理解太清,还有待继续学习。。。。。。

上面有两种循环方式,while明显简单更多,这应该就是思维差异,希望多锻炼,能有所提升。

0 0
原创粉丝点击