【问题标题】:Seg fault during fgets?fgets期间的段错误?
【发布时间】:2012-11-16 03:58:24
【问题描述】:

这是我的代码:

    while (fgets(line, 1000, fp) != NULL) 
    { 
      printf("backin!");
      if ((result = strtok(line,delims)) == NULL)
        printf("Need from_id, to_id, and distance on each line of input file.\n");
      else
        from_id = atoi(result);
      printf("check!\n");
      if ((result = strtok(NULL,delims)) == NULL)
        printf("Need from_id, to_id, and distance on each line of input file.\n");
      else
        to_id = atoi(result);
      printf("check!\n");
      if ((result = strtok(NULL,delims)) == NULL)
        printf("Need from_id, to_id, and distance on each line of input file.\n");
      else
        distance = atof(result);
      printf("check!\n");
      printf("from_id: %d, to_id: %d, distance: %f",from_id, to_id, distance);
      if(BuildGraph(graph_array, from_id, to_id, distance) == -1)
        printf("Error while filling in graph type"); 
      printf("check!\n");
    }

所有这些 printfs 只是为了定位段错误发生的位置。输入文件有 100 行长,这个函数工作了 15 次,完成了所有的检查,然后在 "backin!" 之前 seg faults在第 16 次迭代时打印。

我查看了输入文件,没有任何可疑之处(肯定少于 1000 个字符),似乎 fgets 有问题,但我不知道是什么。

【问题讨论】:

  • 检查您之前提出的问题并接受您认为好的答案
  • line 是如何定义的?它是否足够容纳 1000 个字符?
  • 哇,原来如此。 Line 包含 21 个字符,这条线看起来像 21,但我猜出于某种原因它是 22。将其更改为 30 并且可以正常工作。谢谢。顺便说一句,我能以某种方式接受这个答案吗?
  • 不,那是评论,不是答案。如果@MichaelSh 添加了答案,那么您可以接受……您是否更改了行以容纳 30 个字符但仍尝试读取 1000?这会破坏 fgets 的长度参数的目的。
  • 我很好奇 - 你认为 1000 参数的含义是什么?

标签: c segmentation-fault fgets


【解决方案1】:

确保line 的大小至少为 1000 个字符或将您的代码更改为:

while (fgets(line, sizeof(line), fp) != NULL) 
...

您的line 需要足够大以容纳最长的行或具有处理部分行的逻辑。

【讨论】:

  • +1:这通常是正确的方法(使用sizeof(line)),除非缓冲区作为参数传递给调用fgets()的函数。然后你需要char *buffer, size_t buflen之类的参数来告诉你缓冲区有多大,然后你调用fgets(buffer, buflen, fp)
【解决方案2】:

您可以在正则表达式"%[^\n]s" 的帮助下尝试使用 fscanf。这将接受您的所有令牌,直到行尾字符。

  • 与问题无关,但仍然练习在 printf 之后使用 getch()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多