获取sscanf读取的字符数量?

36

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

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

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

显然,最简单的方法是计算sscanf解析的字符数,但如果没有简单的方法来实现这一点,我也可以接受替代性的双重解析选项。不过,我目前正在使用sscanf,因为它快速、简单且易于阅读。总之,我只需要一种方法来评估这个双精度数并在此之后继续解析。

2个回答

54

您可以使用格式说明符%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'. */
}

2
我似乎无法使其在Microsoft实现中工作,如下所示:sscanf_s(p, "%s %d\n%n", toString, (int)_countof(toString), &itemCount, &pos); pos似乎根本没有改变。 - c00000fd

4
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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接