c - 使 fscanf 忽略可选参数

标签 c scanf

我正在使用 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/

相关文章:

C/C++ printf() 在 scanf() 问题之前

我不能在 char 数组上设置空终止吗?

c - C中要同步的字符串

c - %zd 说明符是 C11 中的可选功能吗?

C程序从用户那里获取联系并将其添加到文件中

c - fscanf 进入一个结构体

c++ - 合乎逻辑!与无

android - 我无法将预建库包含到 android studio 中

C:参数中的 float ,返回类型为空白或错误

C 代码似乎放错了用 fscanf 读取的值