变量不会在读取文件的循环中递增

时间:2014-10-11 06:14:37

标签: c fgets scanf

我的代码按以下格式读取输入:

  • 第一行只有一个数字
  • 其他行有一个数字和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 $ cat places

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部分有关。如果我评论这部分,计数工作正常。但是,我无法弄清楚为什么会这样。

代码有什么问题?

注意:由于这是作业的一部分,我无法发布整个代码。 我用/ * code * / comment。

省略了不相关的部分

2 个答案:

答案 0 :(得分:0)

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。这是另一个问题。

答案 1 :(得分:0)

问题是文化和户外的大小都是1,所以没有足够的空间来容纳新的角色。用大小2定义它们可以解决问题。