问题描述
基本上,我重写的代码在运行时不断给我一个分段错误(核心转储)错误,我决定检查每个步骤以排除问题。
我的代码有效,直到我尝试访问/使用输入文件数据的最后一行。我对这一行和上一行做了同样的事情,但它暗示了一些错误。
输入文件本身很简单:
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
)。否则,使用它们可能会导致问题。当然,这取决于您正在读取的数据,因此如果您能控制它,则不一定有问题。