【问题标题】:Variable does not increment in loop that reads file变量在读取文件的循环中不递增
【发布时间】: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 的内容。
  • 但是citycontinentculturaloutdoors 是如何声明的?
  • 还有'line' - 我们需要查看数据decs。
  • 我很抱歉。由于这是作业的一部分,我无法发布整个代码。我认为那部分就足够了。我不知道该怎么办……也许我一开始就不应该发帖。

标签: c fgets scanf


【解决方案1】:

strcpy 将第二个参数复制到第一个参数。在您的代码中,您似乎假设相反

char *cont_temp = malloc(strlen(continent) + 1);    
strcpy(city, cont_temp);

在这种情况下,您将 cont_temp 复制到 city。但是此时cont_temp 包含垃圾,而city 包含您刚刚从文件中读取的数据。这是问题之一。显然应该是

strcpy(cont_temp, city);

不应该吗?

但是,我不明白您为什么使用strlen(continent) 来确定内存大小,然后突然切换到使用city。这是另一个问题。

【讨论】:

  • 确实如此。我在大陆想,切换到城市测试,忘记改变它。所以我颠倒了顺序并创建了大小合适的 *char。但似乎问题仍然存在。有什么想法吗?
  • 顺便说一句,如果我注释掉 else if 的正文,问题仍然存在。
【解决方案2】:

问题是文化和户外的大小为 1,因此没有足够的空间容纳换行符。用大小 2 定义它们可以解决问题。

【讨论】:

    猜你喜欢
    • 2019-11-16
    • 2020-03-10
    • 2021-09-06
    • 1970-01-01
    • 2011-10-15
    • 2015-11-28
    • 2020-01-21
    • 2012-09-22
    • 1970-01-01
    相关资源
    最近更新 更多