首页 > 解决方案 > 文件 I/O 中的分段错误,无法确定

问题描述

基本上,我重写了在运行时不断给我一个分段错误(核心转储)错误的代码,我决定检查每个步骤以排除问题。

我的代码有效,直到我尝试访问/使用输入文件数据的最后一行。我对这一行和前一行做同样的事情,但它暗示了一些错误。

这是我的文件 I/O 和数据处理代码:

在此处输入图像描述

输入文件本身很简单:

20 20
10 10 u
5 5 d

标签: file-iosegmentation-faultc89

解决方案


在第 27 行,您取消引用 uninitialized playerDirInput,这是未定义的行为:

playerDir = (char)playerDirInput[0];

可能是你崩溃的原因。如果该代码块旨在反映以下代码块,那么您似乎还没有阅读该行的第三项,这playerDirInput可能是该行的来源。那将是这样的:

fgets(line, 8, f);

playerRowChar = strtok(line, " ");
playerRow = atoi(playerRowChar);

playerColChar = strtok(NULL, " ");    // <- fixed this, see below.
playerCol = atoi(playerColChar);

playerDirInput = strtok(NULL, " ");   // <- add this.
playerDir = (char)playerDirInput[0];

但是,我建议您改为选择更简单的sscanf版本,类似于(包括检查以确保您获得这三个项目):

fgets(line, 8, f);
if (sscanf(line, "%d %d %c", &playerRow, &playerCol, &playerDir) != 3) {
    handleErrorIntelligently();
}

我倾向于更喜欢fgets后跟sscanf,而不是fscanf. 后者可能会失败,以至于您不确定输入流指针的最终位置。使用fgets,您始终知道您已经阅读了一行(或者可以轻松检测到您阅读了部分行并进行调整)。


您应该查看的其他潜在问题:

  • 在第 25 行,这strtok应该是NULL类型,而不是line. 后者将简单地重新读取该行上的第一项,而您需要下一项。
  • 您确实应该检查可能返回有问题的值的函数(例如NULLfrom strtok)。否则,使用它们可能会导致问题。当然,这取决于您正在阅读的数据,因此如果您控制它,可能不一定是问题。

推荐阅读