【问题标题】:sscanf error on scanning a formatted file扫描格式化文件时出现 sscanf 错误
【发布时间】: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,并接受。)

标签: c linux string unix scanf


【解决方案1】:
  1. while(fgets(line, sizeof(line), file)) 不应该是 while(fgets(line, sizeof(line), f)) 吗? 可以查看 fgets() 的man page

  2. 1234563字符。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 2019-11-08
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    相关资源
    最近更新 更多