sscanf从一行读取多个值时跳过最终值

时间:2019-05-10 20:44:50

标签: c scanf

我正在尝试从文件中获取输入,文件已格式化且每行有5个值,该代码仅读取前4个并跳至下一行。

文件格式如下:

1 | 1 | 1 | qwqqqqqqqq | q |
2 | 2 | 2 | a | a |
3 | 3 | 3 | e | e |
(this line has nothing)
 char buffer[100];
 for(int i=0; i<numofline; i++)
    {
        fgets(buffer,100,fr);

        sscanf(buffer,"%d | %d | %d | %[^|]s | %[^|]s |\n", &dump, &sa[i].v1, &sa[i].v2,sa[i].v3, sa[i].v4);

        printf("%-5d%-5d%-5d%-20s%-20s\n", dump, sa[i].v1, sa[i].v2,sa[i].v3,sa[i].v4);
     }

我希望结果与文件一样

1    1    1    qwqqqqqqqq  q
2    2    2    a           a
3    3    3    e           e

但实际结果缺少最后一列

1    1    1    qwqqqqqqqq
2    2    2    a         
3    3    3    e         

1 个答案:

答案 0 :(得分:5)

%[^|]s总是会失败,因为%[^|]会消耗所有非管道字符,包括s,因此s永远不会匹配。

也就是说,%[^|]是scanf输入指令,但是格式字符串中的s本身就是匹配的。只需删除该s

此外,请始终检查scanf的返回值以查看成功填充了多少个变量。

if (sscanf(buffer, "%d | %d | %d | %[^|] | %[^|] |",
                   &dump, &sa[i].v1, &sa[i].v2, sa[i].v3, sa[i].v4) != 5) {
    /* handle input error somehow */
}