扫描格式化文件时出现sscanf错误

时间:2014-11-07 05:21:44

标签: c linux string unix scanf

我正在尝试使用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);
    }
}

输出与输入文件完全相同。这是为什么?有人有解释吗?

1 个答案:

答案 0 :(得分:0)

  1. while(fgets(line, sizeof(line), file))不应该while(fgets(line, sizeof(line), f))? 您可以查看fgets()的man page

  2. 接下来,要更正代码中的问题,char str[20];需要更改为char str[128];,因为string文件的输入要长得多而不是20个角色。

  3. 但是,对于使用返回正确答案的结构,IMO是Undefined behaviour的一部分。