用C语言对txt文件进行气泡排序的程序

问题描述 投票:-1回答:1

我正在写一个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 

我是新来的,所以我知道我的代码很烂,但对我来说,我看不到它到底哪里出了问题。任何帮助或建议都是感激的。

c arrays for-loop bubble-sort
1个回答
1
投票

正如jwdonahue所说的,问题在于你对 name. char name[20] 创建一个20个数组 char的,而不是20根弦。

当你运行 while(ch!=EOF) 循环发生了什么?第一次通过你发现第0个元素的地址在 name 并写 Andrewname['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, AMillMill.

希望这对你有足够的帮助,让你解脱出来 :)

© www.soinside.com 2019 - 2024. All rights reserved.