获取sscanf读取的字符数?

Ale*_*ing 30 c scanf string-parsing

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

// char* expression;
double value = 0;
sscanf(expression, "%lf", &value);
Run Code Online (Sandbox Code Playgroud)

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

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

hmj*_*mjd 44

您可以使用格式说明符%n并提供其他int *参数sscanf():

int pos;
sscanf(expression, "%lf%n", &value, &pos);
Run Code Online (Sandbox Code Playgroud)

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'. */
}
Run Code Online (Sandbox Code Playgroud)

  • 我似乎无法使其适用于 [Microsoft 实现](https://msdn.microsoft.com/en-us/library/t6z7bya3.aspx?f=255&MSPPError=-2147217396) 如下:`sscanf_s(p , "%s %d\n%n", toString, (int)_countof(toString), &itemCount, &pos);` `pos` 似乎根本没有改变。 (2认同)