我正在使用fscanf来读取包含像
这样的行的文件 数字<!> lt; -whitespace - <!> gt; string <!> lt; -whitespace - <!> gt; optional_3rd_column

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

示例数据:
12 foo something
03吧
24件事#randomcomment

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

我目前有类似

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

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

有帮助吗?

解决方案

在我看来,最简单的解决方案是scanf(<!>“;%d%s <!>”,<!> amp; num,<!> amp; word)然后fgets()吃掉其余部分。

其他提示

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

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

[^\n]表示匹配尽可能多的不是换行符的字符,并且*像以前一样抑制赋值。另请注意,您不能在%s%*[\n]之间放置空格,因为否则格式字符串中的空格将与换行符匹配,导致<=>匹配整个后续行,这不是什么你想要的。

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top