获取sscanf读取的字符数?

时间:2012-11-21 22:31:24

标签: c string-parsing scanf

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

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

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

显然,最简单的方法是以某种方式计算sscanf解析的字符数,但是如果没有简单的方法可以做到这一点,我打开其他双解析选项。但是,我目前正在使用sscanf因为它快速,简单且易读。无论哪种方式,我只需要一种方法来评估double并继续解析它。

2 个答案:

答案 0 :(得分:44)

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

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'. */
}

答案 1 :(得分:3)

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