#include <stdio.h >
#include <string.h>
void main ()
{
char arr[][10]={"America","England","Chian","Japan","France"},tmp=NULL;
char (ptr)[10]=arr;
short i,j,k;
printf("排序前:");
for(i=0;i<5;i++,ptr++)
printf("%s\n",*ptr);
for(i=0;i<4;i++)
{
k=i;
for(j=i+1;j<5;j++)
if(strcmp(*(ptr+i),*(ptr+j))>0)
k=j;
if(k!=i)
{
strcpy(tmp,(ptr+i));
strcpy((ptr+i),(ptr+k));
strcpy((ptr+k),tmp);
}
}
for(i=0;i<5;i++,ptr++)
printf("%s\n",*ptr);
getch();
}
代码丢失了很多星号,不知道到底有多少错误,明显的基础错误如下:
(1)temp没有申请空间
(2)排序前,需要把ptr重置一下,排序时,内层for循环的if语句 if(strcmp( *(ptr+i), *(ptr+j))>0)这里不应该用 ptr+i,而是ptr+k,每次比较应该是与当前最小值比较,而不是跟 ptr+i比较。
(3)最后输出的时候,需要把ptr重新赋值一下
代码贴在下面,修改的部分在代码中有注释。
运行结果:
代码修改如下:
#include <stdio.h >
#include <string.h>
void main ()
{
char arr[][10]={"America","England","Chian","Japan","France"},tmp[10];//修改1 给tmp一块内存空间
char (*ptr)[10]=arr;
short i,j,k;
printf("排序前:");
for(i=0;i<5;i++,*ptr++)
printf("%s\n",*ptr);
ptr = arr; //修改2 重置ptr
for(i=0;i<4;i++)
{
k=i;
for(j=i+1;j<5;j++)
{
if(strcmp(*(ptr+k),*(ptr+j))>0) //修改3 ptr+i改成 ptr+k,每次都是跟当前最小值进行比较
k=j;
}
if(k!=i)
{
strcpy(tmp,*(ptr+i));
strcpy(*(ptr+i),*(ptr+k));
strcpy(*(ptr+k),tmp);
}
}
ptr = arr; //修改4 重置ptr
for(i=0;i<5;i++,ptr++)
printf("%s\n",*ptr);
getchar();
}
主要两个问题,一是tmp没有分配空间;二是ptr在循环中进行了移动,那么后续需要将ptr重新指向arr才行
修改如下:
#include <stdio.h >
#include <stdlib.h>
#include <string.h>
void main ()
{
char arr[][10]={"America","England","Chian","Japan","France"};
char tmp[10];
char (*ptr)[10]=arr;
short i,j,k;
printf("排序前:\n");
for(i=0;i<5;i++,*ptr++)
printf("%s\n",*ptr);
ptr = arr;
for(i=0;i<4;i++)
{
k=i;
for(j=i+1;j<5;j++)
if(strcmp(*(ptr+i),*(ptr+j))>0)
k=j;
if(k!=i)
{
strcpy(tmp,*(ptr+i));
strcpy(*(ptr+i),*(ptr+k));
strcpy(*(ptr+k),tmp);
}
}
printf("排序后:\n");
ptr = arr;
for(i=0;i<5;i++,*ptr++)
printf("%s\n",*ptr);
system("pause");
}