这是我到目前为止所得到的......
#include<stdio.h>
#include<string.h>
FILE *fp;
int n,num;
int i,j;
int result,index;
char name[50][50];
char jar[1024];
char temp[1000];
main()
{
clrscr();
fp=fopen("EXO-KAI.docx","a+");
printf("\nHow Many Names You Want to Add: ");
scanf("%d",&num);
printf("\nEnter Name:\n");
for(i=0;i<num;i++)
{
scanf("%s",&name[i]);
fprintf(fp,"%s\n",name[i]);
}
for(i=0;i<num;i++)
{
index=i;
for(j=i+1;j<num;j++)
{
result=strcmp(name[index],name[j]);
if(result>0)
index=j;
}
strcpy(temp,name[index]);
strcpy(name[index],name[i]);
strcpy(name[i],temp);
}
fp=fopen("EXO-LAY.docx","a+");
printf("\nThe Sorted Names are:\n");
for(i=0;i<num;i++)
{
printf("\n%s",name[i]);
fprintf(fp,"%s\n", name[i]);
}
fclose(fp);
getch();
}
在第一次运行中,已排序的名称将写入文件中。在第二次运行中,程序应该读取文件中的书面名称并将其与新名称一起排序。但这不起作用。你能帮我吗?
答案 0 :(得分:0)
您的代码中的问题是您使用冒泡排序来排序所有字符串,但是您将字符串swap放在内部循环之外。因此,当字符串name[j]
大于字符串name[index]
时,这不会正确更改字符串顺序。所以为了对字符串进行排序,你可以这样做:
for(i=0;i<num;i++) {
for(j=i+1;j<num;j++) {
index = i;
result=strcmp(name[index],name[j]);
if(result>0) {
strcpy(temp,name[index]);
strcpy(name[index],name[j]);
strcpy(name[j],temp);
index = j;
}
}
}
因此,如果字符串name[j]
大于name[index]
,则执行交换。否则什么都不做。
您使用的冒泡排序方法的复杂度为O(N^2)
。因此,更好的方法是使用快速排序,平均复杂度为O(NlogN)
。为此,您可以使用C的库函数qsort()
来实现此目的。首先,您可以定义自己的字符串比较器:
int my_str_compare(const void * a, const void * b)
{
return strcmp((char*) a, (char*) b);
}
然后您可以直接调用qsort
函数来替换代码中的for循环:
qsort (&name[0], num, 50, my_str_compare);
这将与您的排序相同,但通常更快。