我正在尝试从文件中获取输入,文件已格式化且每行有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
答案 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 */
}