使用sscanf检查字符串格式

时间:2013-11-26 11:14:13

标签: c scanf

我想将我的字符串与给定格式进行比较。

我想在支票中使用的格式是:

"xxx://xxx:xxx@xxxxxx" // all the xxx are with variable length

所以我使用sscanf()如下:

if (sscanf(stin,"%*[^:]://%*[^:]:%*[^@]@") == 0) { ... }

在这种情况下将scanf的返回值与0进行比较是否正确?

2 个答案:

答案 0 :(得分:1)

如果所有字段都匹配,您将只返回零;但这并不能告诉你在实践中蹲下来。它可能在第一个字符中以冒号失败,但仍然会返回0.

你需要至少有一个被计算的转换(%n不计算在内),并且最后发生这种转换,因此你知道之前的匹配也是如此。您永远无法判断尾随上下文(上次转换规范之后的数据)是否匹配,并且sscanf()如果已转换数据则不会进行备份,即使备份将允许尾随上下文匹配。

对于您的方案,可能是:

char c;
int  n;

if (sscanf(stin, "%*[^:]://%*[^:]:%*[^@]@%n%c", &n, &c) == 1)

这需要@之后至少一个字符。它还会告诉您有多少个字符,包括@

答案 1 :(得分:0)

OP的建议很接近。

@Jonathan Leffler是正确的,因为将无说明符sscanf()的结果与0进行比较并不区分匹配和不匹配。

要测试“xxx:// xxx:xxx @ xxxxxx”,(并假设任何带有“x”的部分需要至少1个匹配),请使用

int n = 0;
sscanf(stin, "%*[^:]://%*[^:]:%*[^@]@%*c%n", &n);
if (n > 0) {
  match();
}

使用fscanf()这种方法有一个模糊的漏洞。带有\0的数据流是个问题。