【问题标题】:Segmentation Fault 11 in C with Struct? [duplicate]带有结构的C中的分段错误11? [复制]
【发布时间】:2021-02-21 14:38:13
【问题描述】:

我目前在此代码中遇到分段错误 11。我正在尝试读取输入文件并将其存储到我的结构中。每当我运行时,它只会打印出文本文件的第一项,然后给我一个 Segmentation Fault 11 错误。这可能是什么原因造成的?

这是我的代码:

    typedef struct{
    int serialNum;
    char giftName[50];
    int price;
    char store[50];
} product;

void read_File(const char *filename)
{
    filename = "items.txt";
    product p[4] = {0};
    int i = 0;
    FILE *file = fopen(filename, "r");
    if (file){
        char line[100];
        while(fgets(line, sizeof line, file) && i < 6){
            fputs(line, stdout);
            if (sscanf(line, "%d %s %d %s", 
                p[i].serialNum,
                p[i].giftName,
                p[i].price,
                p[i].store) == 5)
                {
                    printf("Storing information in structure complete.");
                }
        }
    
    fclose(file);
}
else{
    perror(filename);
}
}

【问题讨论】:

  • p 只有4 成员时,为什么你的限制是i &lt; 6(即i &lt;= 5)?
  • 这里有几个问题。您的while 循环永远不会增加i,因此它的值始终为0。您已为4 个产品分配空间,但您的i &lt; 6 建议您最多允许6 个。您正在检查sscanf 的结果为5 ,但您只扫描 4 个项目。
  • 实际上允许无限行读取,因为i没有改变。
  • 提示一下,不要使用sscanf() 作为条件。它使调试更加困难,if 的可读性大大降低
  • 您正在使用sscanf 完成 4 项作业。为什么将结果与 5 进行比较?

标签: c segmentation-fault structure fault


【解决方案1】:

要通过sscanf()(或其他scanf() 系列)读取整数,您必须传递指针,以便sscanf() 可以写入使用指针读取的整数。

另一方面,要通过sscanf() 读取字符串,您不需要也不应该添加&amp;,因为数组将自动转换为指向第一个元素的指针。

同时检查== 5 也很奇怪,虽然只有 4 件事要阅读。

            if (sscanf(line, "%d %s %d %s", 
                &p[i].serialNum, /* add & to pass pointer */
                p[i].giftName,
                &p[i].price, /* add & to pass pointer */
                p[i].store) == 4) /* correct number */

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多