C程序,已有代码,写出结果,用到了指针,请高手进,看看这到底输出什么,被弄疯了:

来源:百度知道 编辑:UC知道 时间:2024/06/16 11:29:57
我输入字符串:asdfgdklaj

结果是:adfgjkls
#include <stdio.h>
#include <string.h>
main()
{char string[80],*p,*q,*r,ch;
printf("input a string:");
gets(string);

for(p=string;*p;p++)
{for(q=r=p;*q;q++) /*从这起,就有点混了,q=r=p,是不是把p的值给r,r再给q? 这个for循环的第二次由于q++,q指向了string的第二个字母s,它这个循环到底是干什么的?*/
if(*r>*q) r=q;
if(r!=p)
{ch=*r;*r=*p;*p=ch;}
}

for(p=string;*p;p++)
{for(q=p;*p==*q;q++); /*这个for循环有分号,它是干什么,*p==*q有什么用啦*/
strcpy(p+1,q);} /*这个为什么是p+1,而不是p,若是p,则输出sfdlj,隔一个输一个*/

printf("result:%s\n",string);
getch();
return 0;
}
我觉的我这个循环我无法吃透,请高手说一下,这到底什么看?如果你在一次很重要的考试中遇到这个题目,你相信自己会在一定时间写出结果吗?
谢谢各位,这是一道考研究生的程序,读程序。

只要别心烦意乱很简单
首先第一个循环 q=r=p就是把p分别赋值给r和q for循环有初值也就是q和r和p初值都是外循环处理的指针(也就是字符串顺序指向的某个字母)内嵌循环很简单 就是只要r指向的字母比p大就把r指向q 等这个内嵌循环结束了r就指向了字符串当前指针(p)之后最小的字母
第一个循环意思是 遍历字符串做如下动作:1,找到当前指针后面最小字母并用r指向它 2,若r有移动过(if(r!=p))就把最小字母(就是p后面的最小字母)和当前指向的字母交换 等第一个大循环结束后 字符串就是从小到大排列了
第二个循环也很简单*是取操作啊 外面循环一样就是遍历 内嵌for循环有分号意思是不做任何操作 那么这个循环结束后q就指向了和p指向字母不一样的”下一个不同字母“,下面的拷贝当然是要把这个“下一个不同字母”拷贝到p的后面了
所以第二个循环结束后 有重复的字母都会变成一个字母
这个程序总体意思就是 排序 去掉重复多余字母
一定要胆大(数俩个循环,可以猜想大概)心细(就说有分号 其实就是把指针调好) 语言的考试很好猜 呵呵 时间也很多 真羡慕你还上学

for(p=string;*p;p++)
{for(q=r=p;*q;q++) /*从这起,就有点混了,q=r=p,是不是把p的值给r,r再给q? 这个for循环的第二次由于q++,q指向了string的第二个字母s,它这个循环到底是干什么的?*/

// 这里就有点冒泡排序的意思了.只不过这里是用字符代替了数字

if(*r>*q) r=q;
if(r!=p)
{ch=*r;*r=*p;*p=ch;}
}

for(p=string;*p;p++)
{for(q=p;*p==*q;q++); /*这个for循环有分号,它是干什么,*p==*q有什么用啦*/

// 这里是将排序好了的字符串转找q中.

strcpy(p+1,q);} /*这个为什么是p+1,而不是p,若是p,则输出sfdlj,隔一个输一个*/

syzh120 说的完全对,也很明白,我就不用再重复了。