2013-11-26 74 views
3

我想比较我的字符串与给定的格式。使用sscanf检查字符串格式

,我要在支票使用格式为:

"xxx://xxx:[email protected]" // all the xxx are with variable length 

所以我用了sscanf()如下:

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

是正确的scanf函数的返回在比较0这个案例?

+2

我认为使用'strtok'会更健壮,这样你就可以说出这个字符串有什么问题,例如,域名缺失 –

+0

看到这个问题:http://stackoverflow.com/q/726122/694576及其解决方案/解决方案的答案/检查URL/URI。 – alk

回答

1

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

您需要至少有一个转换在那里计数(%n不计算),并在最后发生,所以你知道以前也是匹配的。您无法判断尾部上下文(上次转换规范后的数据)是否匹配,并且如果已转换数据,则即使备份允许尾部上下文匹配,它也不会进行备份。

对于您的情况,这可能是:

char c; 
int n; 

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

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

+0

它一定是最后一个! –

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的数据流是一个问题。