用C语言对txt文件进行冒泡排序的程序
Program to bubble sort a txt file in C
我正在编写一个 C 程序,以获取一个包含玩家姓名和他们获得多少胜利(用于更大的游戏项目)的 txt 文件,并将它们从最高到最低的胜利数量排序。当代码编译并成功订购 wins 时,我遇到了名称问题,它们似乎相互堆叠。
#include<stdio.h>
#include<stdlib.h>
char name[20];
int wins[20];
void main()
{
FILE *fp;
int i=0,size,j,swap;
char ch;
fp=fopen("record.txt","r");
if(fp==NULL)
{
printf("\n Cannot open the file \n");
exit(0);
}
while(ch!=EOF)
{
fscanf(fp,"%s %d",&name[i],&wins[i]);
ch=fgetc(fp);
i++;
}
size=i-1;
for(i=1;i<size;++i)
for(j=0;j<size-i;j++)
if(wins[j+1]>wins[j])
{
swap = wins[j];
wins[j] = wins[j+1];
wins[j+1] = swap;
swap = name[j];
name[j] = name[j+1];
name[j+1] = swap;
}
fp=fopen("sortedRecord.txt","w");
for(i=0;i<size;i++){
fprintf(fp,"%s %d \n",&name[i],wins[i]);
printf ("%s %d \n", &name[i],wins[i]);
}
fclose(fp);
}
这是输入文件"record.txt"
Andrew 5
Billboy 10
Hill 7
Mill 1
这是我 运行 得到的结果。
BHAMill 10
HAMill 7
AMill 5
Mill 1
我是代码新手,所以我知道我的代码很糟糕,但对于我来说,我无法确切地看出哪里出了问题。感谢任何帮助或建议。
正如 jwdonahue 所说,问题在于您对 name
的定义。 char name[20]
创建一个包含 20 个 char
的数组,而不是 20 个字符串。
当您 运行 while(ch!=EOF)
循环时发生了什么?第一次通过你在 name
中找到第 0 个元素的地址并在那里写 Andrew
所以 name
有 ['A', 'n', 'd', 'r', 'e', 'w', '[=17=]', '[=17=]', '[=17=]', '[=17=]']
( [=18=]
是字符串字符的结尾).第二次通过你在 name
中找到第一个元素的地址并写入 Billboy
,但是第 0 个元素仍然存在并且没有改变所以你最终得到的内容是 ['A', 'B', 'i', 'l', 'l', 'b', 'o', 'y', '[=21=]', '[=21=]']
.将 Hill
添加到第二个位置会导致 ['A', 'B', 'H', 'i', 'l', 'l', '[=23=]', 'y', '[=23=]', '[=23=]']
。最后添加 Mill
得到数组 ['A', 'B', 'H', 'M', 'i', 'l', 'l', '[=25=]', '[=25=]', '[=25=]']
。
然后当您对分数进行排序时,您正在对该数组中的字符进行排序,最终为 ['B', 'H', 'A', 'M', 'i', 'l', 'l', '[=26=]', '[=26=]', '[=26=]']
(您的排序只会影响前四个字符)。在您的 print 语句中,您然后分别从第 0、1、2 和 3 个位置开始打印字符数组,因此您得到 BHAMill
、HAMill
、AMill
和 Mill
。
希望这足以帮助您摆脱困境。 :)
我正在编写一个 C 程序,以获取一个包含玩家姓名和他们获得多少胜利(用于更大的游戏项目)的 txt 文件,并将它们从最高到最低的胜利数量排序。当代码编译并成功订购 wins 时,我遇到了名称问题,它们似乎相互堆叠。
#include<stdio.h>
#include<stdlib.h>
char name[20];
int wins[20];
void main()
{
FILE *fp;
int i=0,size,j,swap;
char ch;
fp=fopen("record.txt","r");
if(fp==NULL)
{
printf("\n Cannot open the file \n");
exit(0);
}
while(ch!=EOF)
{
fscanf(fp,"%s %d",&name[i],&wins[i]);
ch=fgetc(fp);
i++;
}
size=i-1;
for(i=1;i<size;++i)
for(j=0;j<size-i;j++)
if(wins[j+1]>wins[j])
{
swap = wins[j];
wins[j] = wins[j+1];
wins[j+1] = swap;
swap = name[j];
name[j] = name[j+1];
name[j+1] = swap;
}
fp=fopen("sortedRecord.txt","w");
for(i=0;i<size;i++){
fprintf(fp,"%s %d \n",&name[i],wins[i]);
printf ("%s %d \n", &name[i],wins[i]);
}
fclose(fp);
}
这是输入文件"record.txt"
Andrew 5
Billboy 10
Hill 7
Mill 1
这是我 运行 得到的结果。
BHAMill 10
HAMill 7
AMill 5
Mill 1
我是代码新手,所以我知道我的代码很糟糕,但对于我来说,我无法确切地看出哪里出了问题。感谢任何帮助或建议。
正如 jwdonahue 所说,问题在于您对 name
的定义。 char name[20]
创建一个包含 20 个 char
的数组,而不是 20 个字符串。
当您 运行 while(ch!=EOF)
循环时发生了什么?第一次通过你在 name
中找到第 0 个元素的地址并在那里写 Andrew
所以 name
有 ['A', 'n', 'd', 'r', 'e', 'w', '[=17=]', '[=17=]', '[=17=]', '[=17=]']
( [=18=]
是字符串字符的结尾).第二次通过你在 name
中找到第一个元素的地址并写入 Billboy
,但是第 0 个元素仍然存在并且没有改变所以你最终得到的内容是 ['A', 'B', 'i', 'l', 'l', 'b', 'o', 'y', '[=21=]', '[=21=]']
.将 Hill
添加到第二个位置会导致 ['A', 'B', 'H', 'i', 'l', 'l', '[=23=]', 'y', '[=23=]', '[=23=]']
。最后添加 Mill
得到数组 ['A', 'B', 'H', 'M', 'i', 'l', 'l', '[=25=]', '[=25=]', '[=25=]']
。
然后当您对分数进行排序时,您正在对该数组中的字符进行排序,最终为 ['B', 'H', 'A', 'M', 'i', 'l', 'l', '[=26=]', '[=26=]', '[=26=]']
(您的排序只会影响前四个字符)。在您的 print 语句中,您然后分别从第 0、1、2 和 3 个位置开始打印字符数组,因此您得到 BHAMill
、HAMill
、AMill
和 Mill
。
希望这足以帮助您摆脱困境。 :)