用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 个位置开始打印字符数组,因此您得到 BHAMillHAMillAMillMill

希望这足以帮助您摆脱困境。 :)