我想比较我的字符串与给定的格式。使用sscanf检查字符串格式
,我要在支票使用格式为:
"xxx://xxx:[email protected]" // all the xxx are with variable length
所以我用了sscanf()
如下:
if (sscanf(stin,"%*[^:]://%*[^:]:%*[^@]@") == 0) { ... }
是正确的scanf函数的返回在比较0这个案例?
我想比较我的字符串与给定的格式。使用sscanf检查字符串格式
,我要在支票使用格式为:
"xxx://xxx:[email protected]" // all the xxx are with variable length
所以我用了sscanf()
如下:
if (sscanf(stin,"%*[^:]://%*[^:]:%*[^@]@") == 0) { ... }
是正确的scanf函数的返回在比较0这个案例?
如果所有字段匹配,您将只返回零;但那不会告诉你在练习中蹲下。它可能在第一个字符冒号失败,它仍然会返回0.
您需要至少有一个转换在那里计数(%n
不计算),并在最后发生,所以你知道以前也是匹配的。您无法判断尾部上下文(上次转换规范后的数据)是否匹配,并且如果已转换数据,则即使备份允许尾部上下文匹配,它也不会进行备份。
对于您的情况,这可能是:
char c;
int n;
if (sscanf(stin, "%*[^:]://%*[^:]:%*[^@]@%n%c", &n, &c) == 1)
这需要@
后至少一个字符。它还会告诉你有多少个字符,包括@
。
它一定是最后一个! –
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
的数据流是一个问题。
我认为使用'strtok'会更健壮,这样你就可以说出这个字符串有什么问题,例如,域名缺失 –
看到这个问题:http://stackoverflow.com/q/726122/694576及其解决方案/解决方案的答案/检查URL/URI。 – alk