下面还是举例来说明:去掉else后的问题在到底在哪里,为什么结果不对了。依旧a[0]="12345",a[1]="12452";
前两个相等故不做if。第三四个a[1]值大,此处就本应该结束循环不再比较了,但是由于去掉了else语句,故依旧执行循环。但因为条件不成立,而只是进行j++;当到第五个数字时,由于a[0]中为5,而a[1]中为2,故if的条件成了,所以a[0]和a[1]进行交换,但是这显然是错误的。因为a[1]的前4项中有比a[0]大的数,早就该结束循环不比较第五个数字了。
原来大意了,呵呵,差点误导了你!实在是抱歉,现在解释的还可以吧?我仔细分析过了,应该没有任何的问题。
附:
改进建议:既然你知道strcpy()函数,为什么还要用第三个for循环一个一个字符的比较呢?可以用strcmp()来进行直接比较,这样就去掉了第三个for语句。
改进代码如下,供参考:
#include "stdio.h"
#include "string.h"
void main(){
char b[20],a[5][20];
int i,j;
printf("input:\n");
for(i=0;i<5;i++)
gets(a[i]);
for(i=0;i<5;i++){
for(j=i+1;j<5;j++){
if(strcmp(a[i],a[j])>0){
strcpy(b,a[j]);
strcpy(a[j],a[i]);
strcpy(a[i],b);
}
}
}
printf("\n\n排序后的结果为:\n\n");
for(i=0;i<5;i++)
puts(a[i]);
}
这样是不是清楚点呢?几乎和一般的整数数组的排序一样了,不是吗?呵呵!
strcmp的具体说明:
int strcmp(const char *string1,const dhar *string2);
按字典序比较字符串string1和string2,若string1排在string2前,返回值小于0;若string1和string2相等,返回值为0;若string1排在string2后,返回值大于0;