失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > c语言检测邮箱地址 c语言实现邮箱地址验证

c语言检测邮箱地址 c语言实现邮箱地址验证

时间:2024-07-08 23:48:11

相关推荐

c语言检测邮箱地址 c语言实现邮箱地址验证

rfc中是这样定义邮箱格式的:html

address = mailbox ; one addressee

/ group ; named list

group = phrase ":" [#mailbox] ";"

mailbox = addr-spec ; simple address

/ phrase route-addr ; name & addr-spec

route-addr = ""

route = 1#("@" domain) ":" ; path-relative

addr-spec = local-part "@" domain ; global address

local-part = word *("." word) ; uninterpreted

; case-preserved

domain = sub-domain *("." sub-domain)

sub-domain = domain-ref / domain-literal

domain-ref = atom ; symbolic reference

感受说的不是很清楚,在附录中有更详细的说明.尝试了几个流行的邮箱服务商,如:express

网易163=>用户名只能包含_,英文字母,数字dom

腾讯邮箱=>由英文、数字、点、减号、下划线组成jsp

gmail=>只能使用字母 (a-z)、数字 (0-9) 和数点 (.)ide

yahoo邮箱=》 4至32个字符(包括字母、数字、下划线),且必须以英文字母开始函数

每一家的限制都不相同:性能

看看这个牛X的正则匹配的,能够有%,最后须要有2到4个字符做为域名的结尾,可是却没有限制总体的长度:网站

\b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\bgoogle

Options: case insensitive。atom

呵呵,由于c程序里要用到,因而综合上面各位写了一个c语言校验邮箱地址的函数:

bool IsValidEmail(const char* pszEmail, const char* pszTip)

{

if(pszEmail == NULL)

{

return false;

}

int iAtPos = 0;

int iLastDotPos = 0;

int i = 0;

int iAtTimes = 0;

while(*(pszEmail + i) != ‘\0′)

{

char ch = *(pszEmail + i);

if(!isprint(ch) || isspace(ch)) //空格和控制字符是非法的,限制得还比较宽松

{

iAtTimes = 0;

break;

}

if(ch == ‘@’)

{

iAtPos = i;

iAtTimes++;

}

else if(ch == ‘.’)

{

iLastDotPos = i;

}

i++;

}

if(i > 64 ||iAtPos < 1 || (iLastDotPos – 2) < iAtPos ||

(i – iLastDotPos) < 3 || (i – iLastDotPos) > 5 || iAtTimes > 1 || iAtTimes == 0) //对@以及域名依靠位置来判断,限制长度为64

{

return false;

}

return true;

}

相比网上另一个版本的校验,性能应该是有所提高的:

bool IsValidEmail(const char *s)

{

char* ms;

if ((ms=strchr(s,’@')) == NULL)

{

return false;

}

if (strchr(ms+1,’@') != NULL)

{

return false;

}

if (strchr(ms+1,’.') == NULL)

{

return false;

}

if (strchr(s,’.') < ms)

{

if (strchr(strchr(s,’.')+1,’.') < ms)

{

return false;

}

}

if (strlen(strrchr(s,’.')+1) > 4 || strlen(strrchr(s,’.')+1) < 2)

{

return false;

}

return true;

}

经过运行1000次来计算花费了多少微妙,进行了一下性能上的比较:

validemail1 test //前一种

Time cost => 244(us), avg => 0(us)

validemail2 test //后一种

Time cost => 590(us), avg => 0(us)

整体而言,第一个校验的格式比第二个要好一倍。可见字符串的操做仍是比较浪费时间的。

参考:

如果觉得《c语言检测邮箱地址 c语言实现邮箱地址验证》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。