回复 4楼 fl8962
先跟楼上说一下,这不是复杂不复杂的问题,我想楼主就是想通过这个问题练习一下指针的使用。你这个改法就失去了它原有的意义。
再回复4楼。楼的代码存在以下几处逻辑错误。
1、两个循环的迭代条件不对。应改成 p<=a+3; q<=a+4;
2、变量x的使用不对。看代码可知楼主打算用选择排序来排这a,x是个中间变量用来在交换变量值时作临时存储用。它要是个实体才能存储,而不该是指针。(注意,这里我说的实体是一级指针,而指针则是二级指针)。所以这里x应该声明为一级指针。如果非要使用二级指针,那么需要在使用前先指向一个一级指针。
3、在输出的时候p的指向位置并没有复位到a,却要向后输入5位,这必然也会造成溢出。
下面我在尽量保持原代码逻辑的情况对错误之处进行修改。
第一段x使用一级指针
程序代码:
#include <stdio.h>
#include <string.h>
void main()
{
char *a[5] = {"qw","we","rt","yu","io"};
char **p, **q, *x;
for(p = a;p <= a + 3; p++)
for(q = p + 1; q <= a + 4; q++)
if(strcmp(*p, *q) > 0)
{
x = *p;
*p = *q;
*q = x;
}
p = a;
for(int i=0;i<=4;i++)printf("%s\n",*(p+i));
}
第二段x使用二级指针
程序代码:
#include <stdio.h>
#include <string.h>
void main()
{
char *a[5] = {"qw","we","rt","yu","io"};
char **p, **q, **x, *t;
x = &t;
for(p = a;p <= a + 3; p++)
for(q = p + 1; q <= a + 4; q++)
if(strcmp(*p, *q) > 0)
{
*x = *p;
*p = *q;
*q = *x;
}
p = a;
for(int i=0;i<=4;i++)printf("%s\n",*(p+i));
}
而真正简单的写法该是这样的
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp(const void * a, const void * b)
{
return strcmp(*(char **)a, *(char **)b);
}
void main()
{
char *a[] = {"qw", "we", "rt", "yu", "io"};
qsort(a, sizeof(a) / sizeof(a[0]), sizeof(a[0]), cmp);
for(int i = 0; i <= 4; i++) printf("%s\n", a[i]);
}