使用sscanf()格式说明符validation电子邮件地址

这可能有点像“修复我的代码”问题,但我看过文档 , 示例和几十个 相关的 问题 ,虽然我在逻辑上或多或少地了解它是如何工作的,但我有麻烦将其转换为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 。 我是否需要使用一些疯狂的%[^...]魔法才能正确转换? 我一直在搞乱%[^@]和那种事情,但我似乎无法让它发挥作用。

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

scanf格式的%s跳过前导空格,然后匹配所有非空白字符,直到不包括下一个空格字符。 因此,当您将其提供给您的电子邮件地址时,则会将整个地址复制到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) 

它将接受名称和域的任何字母,数字,下划线和句点字符串。 然后,如果您确实需要拆分域的最后一部分,请单独执行此操作。