【问题标题】:Making fscanf Ignore Optional Parameter使 fscanf 忽略可选参数
【发布时间】:2010-09-19 17:39:58
【问题描述】:

我正在使用 fscanf 读取一个文件,其中包含类似
的行 数字 字符串 optional_3rd_column

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

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

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

我目前有类似的东西

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

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

【问题讨论】:

    标签: c scanf


    【解决方案1】:

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

    【讨论】:

    • 是的.. 但我目前正在使用 scanf 匹配的项目数 >=2 来检测文件的有效部分......如果我可以将这个过程集成到scanf 本身以保持 while 循环条件完整
    • 我不确定我是否理解,sscanf 的工作方式与 scanf 的工作方式几乎相同,即它将返回匹配的项目数,因此您可以使用相同的逻辑,即 while (fgets(buf , size, stdin) != NULL && sscanf(buf, "%d %s", &num, &word) == 2) { assign stuff }.
    【解决方案2】:

    我经常在字符串 you just, er, gots 上使用 gets() 后跟 sscanf()。

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

    【讨论】:

    • 我希望你是在开玩笑说使用gets()。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2019-04-11
        • 2021-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-04
        • 1970-01-01
        • 2011-11-20
        • 1970-01-01
        相关资源
        最近更新 更多