题
我正在使用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。
奖励:您可以将输入结束的测试与解析分开。
不隶属于 StackOverflow