用指针实现选择法排序问题
从键盘输入8个数,用选择法按由大到小的顺序排列
为什么程序这样写能编译通过,但是执行时,输入参数后,提示出现“遇到问题需要关闭”
- C/C++ code
# include<stdio.h>void main(){ int data[8],*p,*p2,*k,temp,i; p=data; for(i=0;i<8;i++) { scanf("%d",p); p++; } for(p=data;p<data+8-1;p++) { k=p; for(p2=p+1;p2<data+8;p2++) if(*p<*p2) k=p2; if(k!=p) {temp=*p; *p=*p2; *p2=temp;} } for(i=0,p=data;i<8;i++,p++) printf("%3d",*p); }问题出在哪里呢?
但是这样写就可以:
- C/C++ code
# include<stdio.h># include<string.h>void main(){ int data[8],*p,*p2,temp,i; p=data; for(i=0;i<8;i++) { scanf("%d",p); p++; } for(p=data;p<data+8-1;p++) { for(p2=p+1;p2<data+8;p2++) if(*p<*p2) {temp=*p; *p=*p2; *p2=temp;} } for(i=0,p=data;i<8;i++,p++) printf("%3d",*p); printf("\n"); }[解决办法]
- C/C++ code
for(p=data;p<data+8-1;p++) { k=p; for(p2=p+1;p2<data+8;p2++)//这个循环之后p2=data+8已经越界了,你后面还用了 if(*p<*p2) k=p2; if(k!=p) //此时和*p2交换会得到垃圾数据的,而且你的p2不一定是最大值 {temp=*p; *p=*p2; *p2=temp;} }
[解决办法]
此楼是正解~