C语言2级难题 求解惑
解决时间 2021-03-02 23:52
- 提问者网友:你挡着我发光了
- 2021-03-02 09:18
#inchude
#inchude
fun(char *w, int n )
{ char t, *s1,*s2;
s1=w: s2=w+n-1;
while(s1 { t=*s1++;
*s1=*s2--;
*s2=t;
}
}
main( )
{ char *p;
p="1234567";
fun(p,strlen(p));
puts(p);
}
答案为什么是
1711717
始终不明白 求解惑
最佳答案
- 五星知识达人网友:思契十里
- 2021-03-02 10:31
楼主你好~
首先声明一点,楼主你这个程序运行时是会出错的。原因在最后面说。
然后根据楼主给的代码的期望目的,来分析下:
核心部分就是fun()中的
while(s1
{
t=*s1++; //(1)
*s1=*s2--; //(2)
*s2=t; // (3)
}
当s1指向的地址小于s2指向的地址时,进行了一次替换操作。
循环1,1234567
进行到(1)时,s1指向'1',t='1',s1自加1,指向'2'(第2位)。此时原始数据1234567。
进行到(2)时,s2指向'7',*s1='7',s2自减1,指向‘6’(第6位)。此时原始数据1734567。
进行到(3)时,s2指向'6',*s2='1'。此时原始数据1734517。
循环2,1734517
进行到(1)时,s1指向'7',t='7',s1自加1,指向'3'(第3位)。此时原始数据1734517。
进行到(2)时,s2指向'1',*s1='1',s2自减1,指向‘5’(第5位)。此时原始数据1714517。
进行到(3)时,s2指向'5',*s2='7'。此时原始数据1714717。
循环3,1714717
进行到(1)时,s1指向'1',t='1',s1自加1,指向'4'(第4位)。此时原始数据1714717。
进行到(2)时,s2指向'7',*s1='7',s2自减1,指向‘7’(第4位)。此时原始数据1717717。
进行到(3)时,s2指向'7',*s2='1'。此时原始数据1711717。
循环4,判断失败,跳出。
最终得到结果1711717
这是这个程序想做到的状态。
但是,这个程序会出错的!
原因在于程序运行到(2)时,试图修改一个常量字符型指针的内容,会报错。
理由在于传入的char* p="123456",这个字符型指针在声明时声称成了字符串,在内存中分配在常量数据区,不能通过*(p+1) = 'a'这样的方式进行修改内容,它是只读的。
注意''单引号表示一个字符,而""双引号表示字符串,'a'与"a"是不同的。
所以当程序想在"1234567"中把第二位的2赋值成第7位的7时,试图修改了常量字符型指针的内容,这就报错了。
而改进方法就是使用字符串的另一种表达,就是将char *p变为char p[7],这样p指向的是这个字符型数组的头元素,而数组声明在内存的栈空间上,是可以改变的:
比如
char p[]="1234567";
p[1] = '7';
第一句声明的时候,事实上右边的"1234567"任然是常量,但是声明是p数组创建了"1234567"的副本,也就是说p实际上是{'1','2','3','4','5','6','7'},当然是可以被改变的。
请追问~
全部回答
- 1楼网友:不如潦草
- 2021-03-02 10:48
#inchude
#inchude
fun(char *w, int n )
{ char t, *s1,*s2;
s1=w: s2=w+n-1;
while(s1
我要举报
大家都在看
推荐资讯