我正在尝试从文件中获取输入,该文件已格式化且每行具有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)
%[^|]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)