我想将我的字符串与给定格式进行比较。
我想在支票中使用的格式是:
"xxx://xxx:xxx@xxxxxx" // all the xxx are with variable length
所以我使用sscanf()
如下:
if (sscanf(stin,"%*[^:]://%*[^:]:%*[^@]@") == 0) { ... }
在这种情况下将scanf的返回值与0进行比较是否正确?
答案 0 :(得分:1)
如果所有字段都匹配,您将只返回零;但这并不能告诉你在实践中蹲下来。它可能在第一个字符中以冒号失败,但仍然会返回0.
你需要至少有一个被计算的转换(%n
不计算在内),并且最后发生这种转换,因此你知道之前的匹配也是如此。您永远无法判断尾随上下文(上次转换规范之后的数据)是否匹配,并且sscanf()
如果已转换数据则不会进行备份,即使备份将允许尾随上下文匹配。
对于您的方案,可能是:
char c;
int n;
if (sscanf(stin, "%*[^:]://%*[^:]:%*[^@]@%n%c", &n, &c) == 1)
这需要@
之后至少一个字符。它还会告诉您有多少个字符,包括@
。
答案 1 :(得分:0)
@Jonathan Leffler是正确的,因为将无说明符sscanf()
的结果与0进行比较并不区分匹配和不匹配。
要测试“xxx:// xxx:xxx @ xxxxxx”,(并假设任何带有“x”的部分需要至少1个匹配),请使用
int n = 0;
sscanf(stin, "%*[^:]://%*[^:]:%*[^@]@%*c%n", &n);
if (n > 0) {
match();
}
使用fscanf()
这种方法有一个模糊的漏洞。带有\0
的数据流是个问题。