【发布时间】:2014-10-11 06:14:37
【问题描述】:
我的代码以以下格式读取输入:
- 第一行只有一个数字
- 其他行有一个数字和 4 个字符串
第一行表示后面的行数。
读取文件后,我想验证读取的行数是否与第一行中指定的相同。为了实现它,我尝试使用变量 count_lines,在 while 循环的每次迭代中递增它。
FILE *fp;
char line[MAXLINELEN];
int count_lines = 0;
char city[50], continent[13], cultural[1], outdoors[1];
int total_lines, id;
...
while(fgets(line, sizeof(line), fp))
{
if (count_lines == 0)
{
sscanf(line, "%d", &total_lines);
nodes2 = calloc(sizeof(node), total_lines);
}
else if (sscanf(line, "%d %s %s %s %s", ...)
{
/* code (previously some malloc and strcopy stuff, but the error occurs even without this part of the code) */
}
else
{
/* code */
}
count_lines++;
printf("point \n");
printf("%d\n", count_lines);
}
数据示例:
-bash-4.1$ 猫的地方
3
1 City1 Continent1 Y Y
2 City2 Continent1 Y Y
3 City3 Continent1 Y N
但是,这是运行代码的输出:
point
1
point
1
point
1
point
1
point
1
point
1
point
1
point
1
point
1
point
1
point
1
point
1
我确认问题与 else if 部分有关。如果我评论这部分,计数工作正常。但是,我无法弄清楚为什么会这样。
代码有什么问题?
注意:由于这是作业的一部分,我无法发布整个代码。 我用 /* 代码 */ 注释省略了不相关的部分。
【问题讨论】:
-
请发布一个显示问题的完整程序。实际代码可能有错字或您遗漏的重要内容。
-
很可能您的
sscanf超出范围并覆盖了一些不应覆盖的内存,其中包括包含count_lines变量的内存区域。这会在每次迭代时意外地将count_lines重置为零。您必须发布完整的sscanf以及与之相关的所有内容。而且,恐怕,我们需要查看您尝试sscanf的实际数据,即line的内容。 -
但是
city、continent、cultural、outdoors是如何声明的? -
还有'line' - 我们需要查看数据decs。
-
我很抱歉。由于这是作业的一部分,我无法发布整个代码。我认为那部分就足够了。我不知道该怎么办……也许我一开始就不应该发帖。