我需要使用以下格式解析c中的字符串“foo =%d”,我需要检查格式是否正确并读取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
字符代码检查没有额外输入。
是否有更好/更正确的方法来做到这一点?
由于
答案 0 :(得分:7)
使用%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. */
}
C99标准中格式说明符n
的说明:
不消耗任何输入。 相应的参数应该是指针 有符号整数,用于写入从中读取的字符数 到目前为止,通过调用fscanf函数的输入流。执行一个 %n指令不会增加返回的赋值计数 完成fscanf函数的执行。没有参数被转换, 但是有一个被消耗了。如果转换规范包括赋值抑制 字符或字段宽度,行为未定义。
请参阅https://ideone.com/d1rhPf上的演示。