C语言 我在使用fseek()时遇到分段错误

zazmityj  于 2023-01-01  发布在  其他
关注(0)|答案(2)|浏览(199)

这是给我分段错误的代码。

void hire_skill()
{
    int linec = 0;
    FILE *p;
    p = fopen("/home/suraj/Coding/PBL/Details/hiree.txt", "r");
    if (p == NULL)
    {
        printf("\nFile did not open\n");
    }

    char c;
    c = fgetc(p);
    while (c != EOF)
    {
        if (c == '\n')
        {
            linec++;
        }
        c = fgetc(p);
    }
    fclose(p);
    printf("\nNumber of lines :\t%d\n", linec);

    FILE *ptrr;
    ptrr = fopen("/home/suraj/Coding/PBL/Details/hiree.txt", "r");
    if (ptrr == NULL)
    {
        printf("\nFile did not open\n");
    }
    rewind(ptrr);
    for (int i = 0; i < linec; i++)
    {
        fscanf(ptrr, "%s", hiree_login[i].name);
        fscanf(ptrr, "%d", hiree_login[i].age);
        fscanf(ptrr, "%s", hiree_login[i].gender);
        fscanf(ptrr, "%d", hiree_login[i].uid);
        fscanf(ptrr, "%s", hiree_login[i].skill);
        fscanf(ptrr, "%lld", hiree_login[i].phno);
    }
    for (int i = 0; i < linec; i++)
    {
        printf("\n%s, %d, %s, %d, %s, %lld\n", hiree_login[i].name, hiree_login[i].age, hiree_login[i].gender, hiree_login[i].uid, hiree_login[i].skill, hiree_login[i].phno);
    }
    fclose(ptrr);
}

这是我用来从文件中获取值并存储它的结构

struct hireeLogin
{
    int age;
    char name[20];
    char gender[1];
    int uid;
    char skill[20];
    long long int phno;
} hiree_login[MAX1]; //MAX1 = 50..

The whole code is on my github account : https://github.com/Suru-web/PBL/blob/main/Emp.c

我尝试了一些不相关的东西,但没有一个工作。也许我不知道这方面的很多,所以我希望任何人能帮助我修复我的代码。谢谢!!

a1o7rhls

a1o7rhls1#

gender是一个大小为1的数组,因此可以保存最大长度为0的字符串。在行fscanf(ptrr, "%s", hiree_login[i].gender);中,scanf可能向缓冲区写入了多于零个的字符,因此该行为未定义。
切勿在格式字符串中使用"%s"。始终使用比缓冲区大小小不超过1的宽度修饰符。

ggazkfy8

ggazkfy82#

在这条线上,

fscanf(p, "%s", hiree_login[i].name);

文件指针p已关闭。您可能需要使用ptrr

相关问题