【问题标题】:c sscanf check if there is more than one parameter in line?c sscanf 检查一行中是否有多个参数?
【发布时间】:2016-02-19 12:18:37
【问题描述】:

是否已经在某个库中构建了一些 c 技巧,还是我必须编写一些东西来手动检查它? 以下代码可以帮助我检测是否读取的参数数量太少,但不会太多,因为 sscanf 例如在 3 处停止,即使该行中有 5 个参数并转到另一行。

 if(sscanf(buffer, "%d", &elements->start_state_) != 1)
 {
   //code
 }

附:请记住,我正在逐行输入。

如果读取了 0 或 1 个参数,该程序将运行良好,但未检测到超过 1 个参数,这对我来说是个问题。

【问题讨论】:

  • 您读取的行中的所有“参数”都是整数吗?然后你可以使用strtol,它会给你一个指向数字后面的下一个字符的指针,在跳过前导空格之后,你可以在循环中使用它来读取多个数字。或者也许使用strtok 在空间上拆分输入。
  • 我很害怕 strtok 解决方案不适用于多个空格,幸运的是它做到了:)!好一个

标签: c scanf


【解决方案1】:

如果我理解正确,您想知道在一行中最后使用的参数之后是否有 任何东西 - 我假设您是通过调用 fgets 获得的。

面对这个问题,我通常所做的只是尝试在最后一个参数之后解码单个非空白字符:

char dummy[2]; /* save space for terminating null */
...
if(sscanf(buffer, "%d%1s", &elements->start_state_, dummy) != 1) {
    ...
}

如果sscanf这一行没有任何东西(参数太少)会返回太低的值,如果至少有一个非空白参数,它会返回1太高。

【讨论】:

    【解决方案2】:

    使用"%n" 保存到目前为止扫描的字符数。请注意," ""%n" 不会失败,它们也不会对sscanf() 结果产生影响。

    int n = 0;
    
    // Allowing whitespace after the number
    sscanf(buffer, "%d %n", &elements->start_state_, &n);
    
    // or
    // Dis-allowing whitespace after the number
    sscanf(buffer, "%d%n", &elements->start_state_, &n);
    
    if (n == 0 || buffer[n]) {
      // problem with buffer
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-09
      • 2015-05-28
      • 1970-01-01
      • 2015-10-15
      • 2022-11-11
      相关资源
      最近更新 更多