谭浩强书里的例子,怎么到机上会有错,高手看看

来源:百度知道 编辑:UC知道 时间:2024/05/23 14:11:36
#include "stdio.h"
main()
{void sort(char *name[],int n);
void print(char *name[],int n);
char *name[5];

int n=5;
int i;
for(i=0;i<n;i++)
{scanf("%s",name[i]);
}
sort(name,n);
print(name,n);

getch();
}
void sort(char *name[],int n)
{char *temp;
int i,j,k;
for(i=0;i<n-1;i++)
{k=i;
for(j=i+1;j<n;j++)
if(strcmp(name[k],name[j])>0)k=j;
if(k!=i)
{temp=name[i];name[i]=name[k];name[k]=temp;}
}
}
void print(char *name[],int n)
{int i;
for(i=0;i<n;i++)
printf("%s\n",name[i]);
}
问题补充:输入
222
111
333
444
555
显示
111
333
444
555
555

222哪里去了,为什么会有二个555。

老谭的书错误多了,不过我还真不敢相信他书上有这么扯的代码,会对一个没初始化的字符指针数组
char *name[5];

scanf("%s", name[i]);
乱写。这样会导致严重的内存读写错误,和病毒差不多了。

问题找到了,解决并不容易。因为不能简单地把代码改成
char name[5][BUFSIZ];
因为后面的sort()函数还要操作这些指针。所以一种解决方案是在后面加上
for (i = 0; i < 5; ++i)
name[i] = malloc(BUFSIZ);
进行动态分配初始化。这就对了。

楼上正解