使fscanf忽略可选参数

时间:2008-10-29 04:32:22

标签: c scanf

我正在使用fscanf来读取具有类似行的文件 数字< -whitespace-> string< -whitespace-> optional_3rd_column

我希望从每列中提取数字和字符串,但如果存在则忽略第3列

示例数据:
12 foo的东西
03吧
24件事#randomcomment

我想提取12,foo; 03,酒吧; 24,忽略“某事”和“#randomcomment”的东西

我目前有类似

的内容
while(scanf("%d %s %*s",&num,&word)>=2)
{ 
assign stuff 
}

但是,对于没有第3列的行,这不起作用。如何在第二个字符串后忽略所有内容?

4 个答案:

答案 0 :(得分:10)

问题是当没有第三列时%*s正在吃下一行的数字,然后下一个%d失败,因为下一个令牌不是数字。要在不使用gets()后跟sscanf()的情况下进行修复,您可以使用指定的字符类:

while(scanf("%d %s%*[^\n]", &num, &word) == 2)
{ 
    assign stuff 
}

[^\n]表示匹配尽可能多的不是换行符的字符,而*会像以前一样抑制分配。另请注意,您无法在%s%*[\n]之间添加空格,因为否则格式字符串中的空格将与换行符匹配,从而导致%*[\n]与后续整个内容匹配线,这不是你想要的。

答案 1 :(得分:4)

使用fgets()一次读取一行,然后使用sscanf()查找您感兴趣的两列,更强大,并且您不必执行任何特殊操作来忽略尾随数据。

答案 2 :(得分:4)

在我看来,最简单的解决方案是scanf(“%d%s”,& num,& word),然后fgets()吃掉剩下的行。

答案 3 :(得分:0)

我经常使用gets()后跟sscanf()在你刚才的字符串上,呃,gots。

奖励:您可以将输入结束的测试与解析分开。