*scanf()
函数系列返回成功匹配和分配的“输入项”(即转换规范)的数量:
返回值
成功时,这些函数返回成功匹配和分配的输入项的数量;如果早期匹配失败,这可能少于规定的数量,甚至为零。
现在,考虑一种格式字符串,其中包含一些与一些文字字符交错的转换规范,并且 以一个或多个文字字符结尾:
// read the response to a CSI 14 t request
int r = sscanf(input, "\033[4;%d;%dt", &resp_y, &resp_x);
考虑此 sscanf 调用的三个潜在输入:
"\033[4;100;200t"
"\033[4;100;200"
"\033[4;100;200foobar"
据我所知,在这种情况下,所有三种情况下的返回值(
r
)都将设置为2
。但是,只有输入 (1) 有效,而输入 (2) 和 (3) 无效。
区分 (1) 与 (2) 和 (3) 的最干净/最正确的方法是什么,即确保整个格式字符串与整个输入成功匹配?
我对这个问题的答案感兴趣
sscanf()
和 fscanf()
。
用途:
int n = 0;
int r = sscanf(input, "\033[4;%d;%dt%n", &resp_y, &resp_x, &n);
if (r != 2 || n == 0)
{
…scanning failed…
}
请注意,对
n
的赋值不计为“转换”,因此不计入返回值。
scanf()
系列函数一起使用。 虽然我已经链接到 POSIX 文档,但 C 标准说的是同样的事情。
“区分”此类输入的最干净/最正确的方法是避免使用
scanf
函数系列。
相反,编写您自己的解析器来实现您需要的所有检查。