获取sscanf读取的字符数?

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

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

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

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

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