c - 将值输入到结构化数组中的数组时出现段错误

标签 c arrays input

我对 C 的结构有疑问。我想编写一个程序,从 grades.txt 读取数据,将其保存到结构化数组并打印它。所以我在下面写了一段代码。 program.c

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

int main()
{
    FILE *fp1;
    fp1 = fopen("grades.txt","r");
    int i = 0,j;
    typedef struct
    {
        int number;
        int q[4];
        int total;
    } student;
    student a[101];
    while(feof(fp1) == 0)
    {
        if(i==0) i++;
        else
        {
            fscanf(fp1,"%d %d %d %d %d %d", &a[i].number, &a[i].q[0], &a[i].q[1], &a[i].q[2], &a[i].q[3], &a[i].total);
            printf("%d %d %d %d %d %d\n", a[i].number,a[i].q[0], a[i].q[1], a[i].q[2], a[i].total);
            i++;
        }
    }
    fclose(fp1);
    return 0;
}

但是,它会打印垃圾值和段错误错误。

778121006 7632239 778121006 7632239 0 -1399308296
Segmentation fault

grades.txt的内容是

成绩.txt

ID       Q1 Q2 Q3 Q4 Total
20131122 20 14 18 22    74
20132400 16 23 11 19    69

最佳答案

首先,您没有检查 fopen() 的返回值,就好像文件不存在一样,您的代码不应该对 fp1 执行进一步操作。因此检查返回值为

fp1 = fopen("grades.txt","r");
if(fp1 == NULL) {
   /* error handling */
}

其次,正如 @paul Why is “while ( !feof (file) )” always wrong? 所提到的,而是在 while 循环中使用 fscanf() 并检查 fscanf() 的返回值为

while(fscanf(fp1,"%d %d %d %d %d %d", &a[i].number, &a[i].q[0], &a[i].q[1], &a[i].q[2], &a[i].q[3], &a[i].total) == 6 ) { /* 6 is the no of read item */
      printf("%d %d %d %d %d \n", a[i].number,a[i].q[0], a[i].q[1], a[i].q[2], a[i].total);
      i++; 
}

您犯了一些愚蠢的错误,因为 printf() 语句中有一个额外的 %d ,您可以在使用 -Wall 编译时解决或观察到这些错误 标志。 这个

printf("%d %d %d %d %d %d\n", a[i].number,a[i].q[0], a[i].q[1], a[i].q[2], a[i].total);

有 6 个 %d,但您只提供了 5 个参数,请删除多余的 %d,因为只有 5 个参数。

关于c - 将值输入到结构化数组中的数组时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50625772/

相关文章:

c - 打印 union 的不同类型数组的输出

javascript - 将二维数组从 ruby​​ 传递到 javascript

arrays - XSLT 将平面结构转换为数组

javascript - 从文本框中获取输入值

java - 使用java中的输入/输出程序计算单词的出现次数

c - 如何在 PostgreSQL C 扩展中写入数据?

c - Linux 套接字 (AF_UNIX) 连接 () 失败

c - 非可移植指针转换

arrays - Perl:基于特定列对具有多列的二维数组进行排序

scala - readLines 流