在 s/fscanf() 中,如何确保整个格式字符串与整个输入匹配?

问题描述 投票:0回答:2

*scanf()
函数系列返回成功匹配和分配的“输入项”(即转换规范)的数量:

返回值

成功时,这些函数返回成功匹配和分配的输入项的数量;如果早期匹配失败,这可能少于规定的数量,甚至为零。

现在,考虑一种格式字符串,其中包含一些与一些文字字符交错的转换规范,并且 以一个或多个文字字符结尾:

// read the response to a CSI 14 t request
int r = sscanf(input, "\033[4;%d;%dt", &resp_y, &resp_x);

考虑此 sscanf 调用的三个潜在输入:

  1. "\033[4;100;200t"
  2. "\033[4;100;200"
  3. "\033[4;100;200foobar"

据我所知,在这种情况下,所有三种情况下的返回值(

r
)都将设置为
2
。但是,只有输入 (1) 有效,而输入 (2) 和 (3) 无效。


区分 (1) 与 (2) 和 (3) 的最干净/最正确的方法是什么,即确保整个格式字符串与整个输入成功匹配?

我对这个问题的答案感兴趣

sscanf()
fscanf()

c scanf
2个回答
2
投票

用途:

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 标准说的是同样的事情。


-1
投票

区分”此类输入的最干净/最正确的方法是避免使用

scanf
函数系列。

相反,编写您自己的解析器来实现您需要的所有检查。

© www.soinside.com 2019 - 2024. All rights reserved.