【求助】关于while循环

bluestar2009 2018-03-20 05:09:02
#include <stdio.h>
/*实现字符串的逆置,用键盘输入字符串,并输出逆置前后的字符串(用函数实现逆置,指针变量作为形参*/

void fun(char *p)
{
int n=0;
while(*p++)
{
n++;
}
p-=2;
while(n--)
{
printf("%c",*p--);
}
}

int main()
{
char str[100]={0};
gets(str);
fun(str);
return 0;
}
1234567890
0987654321Press any key to continue



为什么
while(*p++)
{
n++;
}
后面要p-=2;p--都不行
while (*p++) s
...全文
373 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-03-20
  • 打赏
  • 举报
回复
不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
 if (条件1) break;
 //...
 if (条件2) continue;
 //...
 if (条件3) return;
 //...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
while (!feof(f)) {
 a=fgetc(f);
 //...
 b=fgetc(f);//可能此时已经feof了!
 //...
}
而这样写就没有问题:
while (1) {
 a=fgetc(f);
 if (feof(f)) break;
 //...
 b=fgetc(f);
 if (feof(f)) break;
 //...
}
类似的例子还可以举很多。
自信男孩 2018-03-20
  • 打赏
  • 举报
回复
因为字符串结束标记'\0'会占用一个字节,这是其一。第二个是while(*p++)这个是后加即*p++指向了‘\0'了,然后p++,p指向了'\0'之后的一个字节位置,这个在后面的输出有限字符时,就需要再减1. 综上所述,p--, p--需要执行两次,即p -= 2; 从while(*p++)循环跳出来后,p指向了'\0'后面的一个字节位置,要让p指向从后面数第一个有效字符,就需要p -= 2;

33,321

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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