跪求大神解答这道C语言错在哪

题目:把s所指字符串中的内容逆置fun(char*s){inti=0;char*q=s;while(*q)q++;//指针移到最后while(*q){s[i++]=*q;... 题目:把s所指字符串中的内容逆置

fun (char *s)
{int i=0;
char *q=s;
while(*q)
q++;//指针移到最后
while(*q)
{ s[i++]=*q;
q--;
}
s[i]=0;

}
请问哪儿不对。
展开
 我来答
hjhjw1991
2013-08-30 · TA获得超过926个赞
知道小有建树答主
回答量:372
采纳率:0%
帮助的人:499万
展开全部
首先算法本身是错误的,这个程序将指针q移到最后,然后直接对s的前端进行赋值操作而不是交换操作,那么结果只会是把s原本的后半截复制两回,而不是字符串逆置。

其次两个循环也有错,第一个循环结束条件是q指向null,那么在执行第二个循环时会因为q指向null而不满足循环入口条件,会直接跳过。

另外指出楼上的一个问题,q++是没错的,因为你事先声明的就是指向char 型的指针,因此在执行++操作时地址是会往后移动一个char位置的,不需要加上sizeof。在c语言中字符串类型末尾会自动添加\0为结束,即使是字符数组在下标溢出之后也会指向不确定的位置从而跳出循环,显然这也不是个死循环。
cpucash
2013-08-30 · TA获得超过1584个赞
知道小有建树答主
回答量:1457
采纳率:66%
帮助的人:955万
展开全部
后面的while(*q) //这里q已经到末尾了,这个while不会运行
你想干嘛?是不是想反序一个字符串?你的方式只能反序一半,因为s的后半部分反序是可以,但是这样把前半部分s的覆盖了,s的前半部分是不会到后半部分的。
你需要在定义一个char的字符,需要交换前后,循环一半
while(s<=q)
{ t=s[i];s[i++]=*q;*q=t;
q--;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友d86ab83
2013-08-30 · 超过16用户采纳过TA的回答
知道答主
回答量:35
采纳率:0%
帮助的人:29.3万
展开全部
第二个while语句应该不能执行吧,因为经过第一个while语句之后*p的植为零,还有就是最后一条语句也有错,按照你的思路,应该是s[i]='\0'。另外给个建议,如果要进行倒置,两个while语句里的内容应该稍改一下。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
不见彩虹多年
2013-08-30 · 超过11用户采纳过TA的回答
知道答主
回答量:53
采纳率:0%
帮助的人:28.8万
展开全部
1、
while(*q)
q++;//指针移到最后
while(*q)应该改成 while( *(q + 1) != '\0' ),保证q移至字符串结束符的前一个字符位置。这里需要保证入参是以字符串结束符结束的,否则需要知道输入的字符串长度。
2、
while(*q)
{ s[i++]=*q;
q--;
}
会使得字符串倒序之后会再次倒序回来,需要把循环改成while( q != &s[i] ),只循环到字符串的中间位置。while循环内将s[i]内容和*q内容交换,而不是直接赋值。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
雷剑士阿尔贝尔0b
2013-08-30 · 超过20用户采纳过TA的回答
知道答主
回答量:78
采纳率:0%
帮助的人:49.9万
展开全部
while(*q)
q++;//指针移到最后

首先,这貌似是死循环;
其次,q是地址,是一个数,q++只是在这个数上加1,并不是指针往后移,指针往后移一位可以加上sizeof(char)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(7)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式