【发布时间】:2014-11-07 05:21:43
【问题描述】:
我正在尝试使用fgets() 和sscanf() 读取和解析输入文件。这是我的功能(这里只列出了相关部分):
void reading_file(char* file)
{
FILE *f = fopen(file, "r");
char line[256];
while(fgets(line, sizeof(line), f))
{
int i = 0;
char str[20];
sscanf(line, "%d %s", &i, str);
printf("%d %s\n", i, str);
}
}
输入文件是:
0 be68c5bc1ee7be6f20728579ee082aed6214825b
1 e2d6c1bb794ff4545ef2f101ca904dbbb3ed3923
这段代码的输出是:
875849270 aa71dbd21bd2b05f3bd261256f443fd5f9f7272e
1633890352 465c63da3d0168553c1027eb00ca364c337ced44
完全错误。
有趣的部分在这里。如果我使用结构来保存输入行,则输出是正确的!修改后的代码在这里:
typedef struct s_s{
int id;
char hash[20];
} s_t;
void reading_file(char* file)
{
FILE *f = fopen(file, "r");
char line[256];
while(fgets(line, sizeof(line), f))
{
s_t s;
sscanf(line, "%d %s", &s.id, s.hash);
printf("%d %s\n", s.id, s.hash);
}
}
输出与输入文件完全相同。这是为什么?有人解释一下吗?
【问题讨论】:
-
为什么要
char str[20];,当您想读取更长的字符串时。 -
试图理解导致未定义行为的代码行为是没有意义的。
-
很高兴您的问题得到解决。如果您认为下面发布的任何答案有助于您解决问题,请考虑通过单击答案旁边的箭头来接受它。一旦您接受答案,回答者和您都会获得一些声誉。拥有足够的声誉,您可以投票选出对您有帮助的答案。也接受了答案浮动,使其对其他读者更有用。
-
@alvinzoo:不要编辑您的问题以表明答案已解决。接受一个答案来解决它。 (如有必要,编写您自己的,如果仅反映标记为 Community Wiki 的 cmets,并接受。)