2012-12-04 50 views
1

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

我最初的代码是:

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

但代码应该拒绝输入诸如 “富= $ 5%£”。 这段代码能工作吗?

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

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

感谢

+1

'这个代码能工作吗?'。你为什么不跑来看? – axiom

回答

6

使用%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. */ 
} 

说明的格式说明n C99标准:

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

查看演示https://ideone.com/d1rhPf

+1

我不知道这是真的还是最新的,但根据Linux的'scanf'手册页:'C标准说:“执行%n指令不会增加完成时返回的赋值计数执行“,但更正似乎与此相矛盾。对于%n转化对回报价值的影响,可能不要做任何假设 – interjay