2

我正在使用 fscanf 读取一个文件,该文件具有像
Number <-whitespace-> string <-whitespace-> optional_3rd_column 这样的行

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

示例数据:
12 foo something
03 bar
24 something #randomcomment

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

我目前有类似的东西

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

但是,这不适用于没有第 3 列的行。如何让它忽略第二个字符串之后的所有内容?

4

4 回答 4

11

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

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

[^\n]说要匹配尽可能多的不是换行符的字符,并且像*以前一样抑制分配。另请注意,您不能在 the%s和之间放置空格%*[\n],否则格式字符串中的空格将匹配换行符,导致%*[\n]匹配整个后续行,这不是您想要的。

于 2008-10-29T05:02:12.430 回答
4

使用 fgets() 一次读取一行,然后使用 sscanf() 查找您感兴趣的两列,更健壮,您无需执行任何特殊操作即可忽略尾随数据。

于 2008-10-29T04:36:27.537 回答
4

在我看来,最简单的解决方案是 scanf("%d %s", &num, &word) 然后 fgets() 吃掉该行的其余部分。

于 2008-10-29T04:44:27.830 回答
0

我经常在字符串上使用gets(),然后是sscanf(),呃,gots。

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

于 2008-10-29T04:37:13.760 回答