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