验证用的sscanf()格式说明符的电子邮件地址(Validating an email addre

2019-10-20 02:52发布

这可能是一个有点“修复-我的代码”的问题,但我看文档 , 示例 ,和几十个 , 中 , 相关的 , 问题 ,虽然我理解逻辑或多或少它是如何工作,我有麻烦将其转化为一个C sscanf()格式的代码。 我还是比较新的C,和我刚开始进入小幅超越简单化的东西,我无法找出更复杂的格式说明(即%[^...]等)。

不管怎么说,这是我有:

char user[EMAIL_LEN];
char site[EMAIL_LEN];
char domain[4];
if(sscanf(input, "%s@%s.%3s", user, site, domain) != 3){
  printf("--ERROR: Invalid email address.--\n");
}

为什么不这项工作? 我只是试图让一个简单的aaaa@bbbb.ccc格式,但由于某些原因sscanf(input, "%s@%s.%3s", user, site, domain)始终计算为1 。 我是否需要使用一些疯狂%[^...]魔术为它正确转换? 我一直在搞乱%[^@]和之类的话,但我似乎无法使它工作。

任何和所有帮助表示赞赏。 谢谢!

Answer 1:

%s在scanf格式跳过前导空白,那么所有非空白字符相匹配并没有包括下一个空格系统字符。 所以,当你给它自己的电子邮件地址,然后整个地址被复制到user的匹配%s 。 然后,作为下一个字符不是@ ,仅此而已匹配和scanf返回1。

您可以尝试使用类似:

sscanf(input, "%[^@ \t\n]@%[^. \t\n].%3[^ \t\n]", user, site, domain)

这将匹配一切都交给一个@或空格作为用户,那么,如果接下来的文字,其实是一个@将跳过它,并保存一切达. 或空白的site 。 但是,这会接受很多不在一个电子邮件地址有效其它字符,并且不会接受较长的域名。 更可能是这样的:

sscanf(input, "%[_a-zA-Z0-9.]@%[_a-zA-Z0-9.]", user, domain)

这将接受任何字母串,数字,下划线和周期的名称和域名都。 然后,如果你真的需要拆断域的最后一部分,这样做分开。



文章来源: Validating an email address with sscanf() format specifiers