我正在使用 fscanf 读取一个文件,其中包含类似
数字 <-whitespace-> string <-whitespace-> optional_3rd_column
我想从每一列中提取数字和字符串,但如果存在第三列则忽略
示例数据:
12 foo 东西
03 巴
24 事#randomcomment
我想提取 12,foo; 03,酒吧; 24、忽略“something”和“#randomcomment”的something
我现在有类似的东西
while(scanf("%d %s %*s",&num,&word)>=2)
{
assign stuff
}
然而,这不适用于没有第 3 列的行。我怎样才能让它忽略第二个字符串之后的所有内容?
最佳答案
问题是当没有第三列时 %*s
正在吃掉下一行的数字,然后下一个 %d
失败了,因为下一个 token 不是数字。要在不使用 gets()
后跟 sscanf()
的情况下修复它,您可以使用指定的字符类:
while(scanf("%d %s%*[^\n]", &num, &word) == 2)
{
assign stuff
}
[^\n]
表示匹配尽可能多的不是换行符的字符,而 *
像以前一样抑制赋值。另请注意,您不能在 %s
和 %*[\n]
之间放置空格,否则格式字符串中的空格将匹配换行符,导致 %*[\n]
匹配整个后续行,这不是您想要的。
关于c - 使 fscanf 忽略可选参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/245802/