文件 I/O 中的分段错误,无法弄清楚

问题描述

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

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

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

enter image description here

输入文件本身很简单:

20 20
10 10 u
5 5 d

解决方法

在第 27 行,您取消引用未初始化的 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,f);
if (sscanf(line,"%d %d %c",&playerRow,&playerCol,&playerDir) != 3) {
    handleErrorIntelligently();
}

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


您应该考虑的其他潜在问题:

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