首页 > 解决方案 > 为什么我会得到这些看似随机的输出?

问题描述

我陷入了一个 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;
}

我得到的输出。

名称文件是这个。

年龄档案是这个。

标签: cdata-structures

解决方案


这是因为您假设文本文件中每个姓名和年龄的结尾都是换行符“\n”。假设您在 Windows 机器中创建了文本文件,则行尾是\r\n,即 - 回车符后跟换行符。使用 Hex Editor Neo,您的文件内容如下所示。

的 name.txt 文件 你的 age.txt 文件

注意行尾 - '0x0d' 是回车 '\r' 而 '0x0a' 是换行符 '\n'。修改您的程序以考虑到这一点。

在此处阅读有关行尾的更多信息:https ://blog.codinghorror.com/the-great-newline-schism/


推荐阅读