C 为什么我会得到这些看似随机的输出?

C 为什么我会得到这些看似随机的输出?,c,data-structures,C,Data Structures,我被困在一个C语言问题中,在这个问题中,我应该从各自的文件中输入球员的姓名和年龄,并为特定数量的球员输出相同的姓名和年龄,这些球员将被输入(或-1退出)。这个问题必须用结构来解决。我已经附上了我正在处理的年龄和姓名文件中包含的数据的输出 有人能解释一下我哪里做错了吗 任何优化方面的帮助都会非常有用。谢谢 下面是代码 #include <stdio.h> #include <stdlib.h> #include <string.h> struct Cricke

我被困在一个C语言问题中,在这个问题中,我应该从各自的文件中输入球员的姓名和年龄,并为特定数量的球员输出相同的姓名和年龄,这些球员将被输入(或-1退出)。这个问题必须用结构来解决。我已经附上了我正在处理的年龄和姓名文件中包含的数据的输出

有人能解释一下我哪里做错了吗

任何优化方面的帮助都会非常有用。谢谢

下面是代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Cricket_Player_DataBase 
{
    char name[30];
    int score;
    char role[11];
    int age;
    int wickets;
};

int main()
{
    FILE *nf_ptr , *af_ptr; //nf_ptr is pointing to name.txt file | af_ptr is pointing to age.txt file
    
    nf_ptr = fopen("name.txt","r");
    af_ptr = fopen("age.txt","r");
    
    int number_of_players = 0; //will be used to fix the size of array of structures

// following code is used just to count number of players, upto the point where 'HERE' is written

    int temp, border_check = 0;
    
    while((temp = fgetc(af_ptr)) != EOF)
    {
        if(temp == '\n') 
        {
            ++number_of_players;
            border_check = 0;
        }
        else border_check++;
    }
    if(border_check > 0) ++number_of_players;
    
    af_ptr = fopen("age.txt","r");

// HERE
    
    struct Cricket_Player_DataBase players[number_of_players];
    
    int temp_age , zero = 0 ;
    char temp_char[30] , ch ;
    
    for(int i=0; i < number_of_players; ++i)
    {
        temp_age =  fgetc(af_ptr);
        players[i].age = temp_age;
        
        while((ch = fgetc(nf_ptr)) != EOF)
        {
            if(ch == '\n')
            {
                strncpy(players[i].name , temp_char , zero+1);
                zero = 0;
                break;
            }
            else
            {
                temp_char[zero] = ch;
                zero++;
            }
        }
    }
    
    int input;
    
    printf("Enter number of players you want to see the data of OR type -1 to exit : ");
    scanf("%d", &input);
    
    if(input > 0)
    {
        for(int i = 0; i < input; ++i)
        {
            printf("Data of player #%d is \nName : %s\nAge : %d\n", i+1 , players[i].name , players[i].age);
        }
    }
    
    fclose(nf_ptr);
    fclose(af_ptr);
    return 0;
}
#包括
#包括
#包括
struct Cricket\u Player\u数据库
{
字符名[30];
智力得分;
角色[11];
智力年龄;
int wickets;
};
int main()
{
FILE*nf_ptr,*af_ptr;//nf_ptr指向name.txt文件| af_ptr指向age.txt文件
nf_ptr=fopen(“name.txt”,“r”);
af_ptr=fopen(“age.txt”,“r”);
int number_of_players=0;//将用于固定结构数组的大小
//下面的代码仅用于计算玩家的数量,直到写入“HERE”为止
内部温度,边界检查=0;
而((温度=fgetc(af_ptr))!=EOF)
{
如果(临时=='\n')
{
++球员人数;
边界检查=0;
}
else border_check++;
}
如果(边界检查>0)+玩家数量;
af_ptr=fopen(“age.txt”,“r”);
//这里
struct Cricket_Player_数据库玩家[玩家数量];
int temp_年龄,零=0;
char temp_char[30],ch;
对于(int i=0;i<玩家的数量;++i)
{
温度=fgetc(af\U ptr);
玩家[i]。年龄=临时年龄;
而((ch=fgetc(nf_ptr))!=EOF)
{
如果(ch='\n')
{
strncpy(玩家[i]。姓名,临时字符,零+1);
零=0;
打破
}
其他的
{
temp_char[zero]=ch;
零++;
}
}
}
int输入;
printf(“输入要查看数据的玩家数量,或键入-1退出:”;
scanf(“%d”,输入(&I));
如果(输入>0)
{
对于(int i=0;i
我知道了

文件就是这个


文件是这样的。

您正在打开af\u ptr而没有关闭它。这可能会引起问题。如果要再次打开同一文件,请使用函数rewind(file)或fclose并再次打开它。

这是因为您假设文本文件中每个名称和年龄的结尾都是换行符“\n”。假设您已经在windows计算机中创建了文本文件,那么行尾是
\r\n
,即-一个回车字符,后跟换行符。使用十六进制编辑器Neo,以下是文件内容的外观

请注意,行尾-'0x0d'是回车符'\r','0x0a'是换行符'\n'。修改您的程序以将此考虑在内


阅读更多关于行结尾的信息:

if(ch='\n')
-->
if(ch='\n')
对此非常抱歉,但我仍然得到相同的输出。我已经纠正了这个错误,但是@kaylumAre你确定你得到了完全相同的输出吗?您的代码还有其他问题,但这应该会稍微改善结果。是的,至少在我的cmd中是这样。您的while循环是错误的
i
在那里永远不会递增,因此它会为文件中的每个名称复制到同一播放器。另外,你没有nul终止名称,因此它不是一个有效的字符串。完成后,得到了不同的输出,但仍然有一些垃圾值。嗯,我认为你需要在temp_age中将fgetc强制转换为int。这可能会导致问题,除此之外,您只扫描一个字符而不是整个int(例如,4而不是40),您应该为输入获取某种边界,以避免超出结构的数组。是的,这就是为什么随着年龄的增长,我得到了错误的输出。非常感谢!:)