【问题标题】:Get number of characters read by sscanf?获取 sscanf 读取的字符数?
【发布时间】:2012-11-10 06:53:16
【问题描述】:

我正在解析一个字符串 (a char*),我正在使用 sscanf 将字符串中的数字解析为双精度数,如下所示:

// char* expression;
double value = 0;
sscanf(expression, "%lf", &value);

这很好用,但我想继续通过传统方式解析字符串。我需要知道sscanf 解析了多少个字符,以便我可以从新的偏移量恢复手动解析。

显然,最简单的方法是以某种方式计算 sscanf 解析的字符数,但如果没有简单的方法可以做到这一点,我愿意接受替代的双重解析选项。但是,我目前使用的是sscanf,因为它快速、简单且易读。无论哪种方式,我只需要一种方法来评估双精度并在它之后继续解析。

【问题讨论】:

    标签: c string-parsing scanf


    【解决方案1】:

    您可以使用格式说明符%n 并为sscanf() 提供额外的int * 参数:

    int pos;
    sscanf(expression, "%lf%n", &value, &pos);
    

    来自 C99 标准的格式说明符 n 的说明:

    不消耗任何输入。 对应的参数应该是一个指向 通过调用fscanf 函数从输入流中读取的字符数写入其中的有符号整数。执行%n 指令不会增加在完成执行fscanf 函数时返回的赋值计数。没有参数被转换,但有一个被消耗。如果转换规范包含赋值抑制字符或字段宽度,则行为未定义。

    始终检查sscanf()的返回值,以确保进行了赋值,并且后续代码不会错误地处理值未更改的变量:

    /* Number of assignments made is returned,
       which in this case must be 1. */
    if (1 == sscanf(expression, "%lf%n", &value, &pos))
    {
        /* Use 'value' and 'pos'. */
    }
    

    【讨论】:

    • 我似乎无法让它为 Microsoft implementation 工作:sscanf_s(p, "%s %d\n%n", toString, (int)_countof(toString), &itemCount, &pos); pos 似乎根本没有改变。
    【解决方案2】:
    int i, j, k;
    char s[20];
    
    if (sscanf(somevar, "%d %19s %d%n", &i, s, &j, &k) != 3)
        ...something went wrong...
    

    变量k 包含直到扫描到j 中存储的整数末尾为止的字符数。

    请注意,%n 不计入成功转换。如果需要,可以在格式字符串中多次使用%n

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      • 2012-06-06
      • 1970-01-01
      • 2023-03-10
      相关资源
      最近更新 更多