C语言 获取 sscanf 读取的字符数



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

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

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

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

您可以使用

格式说明符%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'. */
}
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

最新更新