我正在写一个C程序,给我一个包含玩家名字和他们赢了多少钱的txt文件(这是一个更大的游戏项目),并将他们从最高到最低的赢钱量排序。当代码编译并成功排序时,我遇到了一个问题,名字似乎是相互堆叠的。
#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)
循环发生了什么?第一次通过你发现第0个元素的地址在 name
并写 Andrew
乃 name
有 ['A', 'n', 'd', 'r', 'e', 'w', '\0', '\0', '\0', '\0']
(该 \0
是字符串的结尾字符)。) 第二次通过你发现第1个元素的地址在 name
并写 Billboy
但第0个元素还在,而且没有改变,所以你最终的内容是 ['A', 'B', 'i', 'l', 'l', 'b', 'o', 'y', '\0', '\0']
. 增加 Hill
到第2位的结果是 ['A', 'B', 'H', 'i', 'l', 'l', '\0', 'y', '\0', '\0']
. 最后加上 Mill
给出数组 ['A', 'B', 'H', 'M', 'i', 'l', 'l', '\0', '\0', '\0']
.
当你对分数进行排序的时候,你会对这个数组中的字符进行排序,这些字符最终会变成为 ['B', 'H', 'A', 'M', 'i', 'l', 'l', '\0', '\0', '\0']
(只有前四个字符会受到排序的影响)。在打印语句中,你将分别从第0、1、2和3位开始的字符数组打印出来,这样你就得到了 BHAMill
, HAMill
, AMill
和 Mill
.
希望这对你有足够的帮助,让你解脱出来 :)