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

cat*_*ndx 2 c scanf

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

该文件的格式如下:

1 | 1 | 1 | qwqqqqqqqq | q |
2 | 2 | 2 | a | a |
3 | 3 | 3 | e | e |
(this line has nothing)
Run Code Online (Sandbox Code Playgroud)
 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);
     }
Run Code Online (Sandbox Code Playgroud)

我希望结果就像文件一样

1    1    1    qwqqqqqqqq  q
2    2    2    a           a
3    3    3    e           e
Run Code Online (Sandbox Code Playgroud)

但实际结果缺少最后一栏

1    1    1    qwqqqqqqqq
2    2    2    a         
3    3    3    e         
Run Code Online (Sandbox Code Playgroud)

mel*_*ene 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 */
}
Run Code Online (Sandbox Code Playgroud)

  • @catmandx`%[]`成功,但是文字`s`-以及后面的所有内容-都失败了 (3认同)