file-io - 文件 I/O 中的分段错误,无法确定
问题描述
基本上,我重写了在运行时不断给我一个分段错误(核心转储)错误的代码,我决定检查每个步骤以排除问题。
我的代码有效,直到我尝试访问/使用输入文件数据的最后一行。我对这一行和前一行做同样的事情,但它暗示了一些错误。
这是我的文件 I/O 和数据处理代码:
输入文件本身很简单:
20 20
10 10 u
5 5 d
解决方案
在第 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
. 后者将简单地重新读取该行上的第一项,而您需要下一项。 - 您确实应该检查可能返回有问题的值的函数(例如
NULL
fromstrtok
)。否则,使用它们可能会导致问题。当然,这取决于您正在阅读的数据,因此如果您控制它,可能不一定是问题。
推荐阅读
- java - 在两个列表中创建匹配元素的映射
- bootstrap-4 - 从 Flask-Bootstrap 迁移到 Bootstrap-Flask
- ios - 带有 facebook/gmail 的 OAuth 不适用于 iOS 模拟器(Cordova 应用程序 + Firebase)
- database - 十月数据库
- python - 重定向来自 SWIG 模块的输出
- excel - VBA向下填充现有值直到最后一行
- r - 在R中将列表转换为数据框
- python - 从用户输入中添加“ord”值
- http - 无法使用 Flutter 访问 HTTP 响应中的 Cookie
- php - 有很多项目时如何处理作曲家磁盘空间使用?