33

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

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

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

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

4

2 回答 2

51

您可以使用格式说明符%nint *sscanf():

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

nC99 标准中的格式说明符说明:

不消耗任何输入。相应的参数应该是一个指向有符号整数的指针,通过这个函数调用从输入流中读取的字符数将写入该整数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'. */
}
于 2012-11-21T22:32:57.307 回答
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在格式字符串中多次使用。

于 2012-11-21T22:35:20.837 回答