C语言将字符串反序的程序,中间有一点不懂得地方,我在注释里面写出来了,望指教...

飛雪一刀 2009-01-16 07:42:00
#include "stdio.h"   
#define MAX 50
void reverse_string(char *string);
int main(){
char name[MAX];
gets(name);
reverse_string(name);
printf("%s",name);
return 0;
}
void reverse_string(char *string)
{
char *ptr = string;
/*
*为什么当我把以下的while循环写成
*while(*ptr++ != '\0')
* ;
*时,程序运行就出现错误了呢
*for(ptr = string; *ptr != '\0';ptr++)
* ;
*也是对的,这三种方法有什么不一样呢?
*/
while(*ptr!= '\0')
ptr++;
ptr--;

/*
**以下三种对string的反序操作都是对的,注意while循环中的string < ptr语句中的<是不能
**被!=代替的若被!=代替,那么对于字符串的长度是偶数的,就不起作用了,因为此时string
**和ptr是永远不会相等的
*/
/*
while(string < ptr){
char temp;
temp = *string;
*string++ = *ptr;
*ptr-- = temp;
}
*/
/*
for(; string < ptr; ptr--,string++){
char temp;
temp = *string;
*string++ = *ptr;
*ptr-- = temp;
}
*/
for(; string < ptr; ptr--,string++){
char temp;
temp = *string;
*string = *ptr;
*ptr = temp;
}

}
...全文
173 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiuqiuleijie 2009-01-16
  • 打赏
  • 举报
回复
while(*ptr++ != '\0')
;
这样写是可以的,但是你要注意了当到达*ptr=='\0'后,ptr仍然会执行ptr++;
因此在循环结束后还要执行一个ptr--;
即:

#include "stdio.h"
#define MAX 50
void reverse_string(char *string);
int main(){
char name[MAX];
gets(name);
reverse_string(name);
printf("%s",name);
return 0;
}
void reverse_string(char *string)
{
char *ptr = string;

while(*ptr++ != '\0')
;
ptr--;

ptr--;

for(; string < ptr; ptr--,string++){
char temp;
temp = *string;
*string = *ptr;
*ptr = temp;
}

}
飛雪一刀 2009-01-16
  • 打赏
  • 举报
回复
哦,对,谢谢二位哈!
lbh2001 2009-01-16
  • 打赏
  • 举报
回复
char *ptr = string;
/*
*为什么当我把以下的while循环写成
*while(*ptr++ != '\0')---> 在循环结束时使ptr指向字符串结束符'\0'之后一个的位置,所以是错误的
* ;
*时,程序运行就出现错误了呢
*for(ptr = string; *ptr != '\0';ptr++))---> 循环结束时使ptr指向字符串结束符'\0'的位置
* ;
*也是对的,这三种方法有什么不一样呢?
*/
while(*ptr!= '\0') ---> 循环结束时使ptr指向字符串结束符'\0'的位置
ptr++;
ptr--; ---> 修正指针使ptr指向字符串结束符'\0'之前的一个位置
xiaoyisnail 2009-01-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wangfeng2500 的回复:]
哪位好人帮我答疑解惑啊
[/Quote]

你要这样做的话,之后要自减两次,原因就是我说的那个,先执行后++,所以while退出时ptr指向'\0'的后面

while(*ptr++ != '\0')
;
ptr--;
ptr--;
飛雪一刀 2009-01-16
  • 打赏
  • 举报
回复
哪位好人帮我答疑解惑啊
飛雪一刀 2009-01-16
  • 打赏
  • 举报
回复
但是此++是后缀啊,应该是先算*是用的还是未改变的ptr啊
比如字符串求长的话

int len = 0;
while(*string++ != '\0'){
len++;
}


int len = 0;
while(*string != '\0'){
string++;
len++;
}

功能确实一样的
xiaoyisnail 2009-01-16
  • 打赏
  • 举报
回复
while(*ptr++ != '\0')
这个错是因为后置++优先级高于解引用*,ptr先被增一,所以不对
飛雪一刀 2009-01-16
  • 打赏
  • 举报
回复
回复一下啊!

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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