我的代码按以下格式读取输入:
第一行告诉以下行数。
读取文件后,我想验证读取的行数是否与第一行中指定的相同。为了实现它,我试图使用变量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。
省略了不相关的部分答案 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定义它们可以解决问题。