2

我需要使用以下格式“foo=%d”解析 c 中的字符串,我需要检查格式是否正确并读取 int 值。

我的初始代码是:

int foo_set = 0;
int foo;
if (sscanf(text, "foo=%d", &foo) == 1)
    foo_set = 1;

但是代码应该拒绝诸如“foo=5$%£”之类的输入。这段代码会起作用吗?

int foo_set = 0;
int foo;
char control;
if (sscanf(text, "foo=%d%c", &foo, &control) == 1)
    foo_set = 1;

使用control字符代码检查没有额外的输入。有没有更好/更正确的方法来做到这一点?

谢谢

4

1 回答 1

9

使用%n格式说明符确定处理结束的位置并检查它是否与字符串的长度匹配:

const char* text = "foo=4d";
int pos;
int foo;

if (sscanf(text, "foo=%d%n", &foo, &pos) == 1 &&
    pos == strlen(text))
{
    /* Valid as all of text consumed. */
}

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

不消耗任何输入。相应的参数应该是一个指向有符号整数的指针,将通过调用 fscanf 函数从输入流中读取的字符数写入该整数。执行 %n 指令不会增加 fscanf 函数执行完成时返回的赋值计数。没有参数被转换,但有一个被消耗。如果转换规范包括分配抑制字符或字段宽度,则行为未定义。

请参阅https://ideone.com/d1rhPf上的演示。

于 2012-12-04T11:18:32.613 回答