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

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

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

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

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

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

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

每一家的限制都不相同:

看看这个牛X的正则匹配的,可以有%,最后需要有2到4个字符作为域名的结尾,但是却没有限制整体的长度:

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

Options: case insensitive。

呵呵,因为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语言实现邮箱地址验证相关推荐

  1. c语言编写一个成绩等级的程序,c语言作业 编写一个输出学生成绩等级的程序

    问题描述: c语言作业 编写一个输出学生成绩等级的程序 1.能够使用if else语句实现. 2.多分支结构的正确使用. 3.能够使用switch case语句实现. 4.正确使用break语句 5. ...

  2. c语言编写计算器保存结果的程序,c语言编写计算器程序.doc

    #includevoid main() { int n; double a,b,c; FILE *fp; fp=fopen("c:\\myfile.txt","w+&qu ...

  3. 163电子邮箱注册登录入口是?企业邮箱和163邮箱有什么区别?

    最近很多小伙伴问我企业邮箱和163邮箱的区别是什么?163电子邮箱注册登录入口在哪里? [TOM企业邮箱]其实单从字面就可以判断,企业邮箱就是企业将自己的域名配置后,即可拥有以企业域名为后缀的公司邮箱 ...

  4. 用c语言编写实心菱形,C语言编写内置菱形的程序

    C语言编写内置菱形的程序 最近迷上了用C语言编写图形的输出程序,有矩形的.三角形.等腰三角形,平行四边形.菱形.沙漏形.今天尝试着将菱形内置到矩形中,结果成功了,下面将快乐分享给大家,也希望广大C程序 ...

  5. C语言编写一下棋程序,C语言编写的与电脑下棋程序代码

    C语言编写的与电脑下棋程序代码 C语言编写的与电脑下棋程序代码 #include "stdafx.h" #include using namespace std; void che ...

  6. C语言编写的判断素数的程序

    下面是一个用C语言编写的判断素数的程序: 复制#include <stdio.h>int main() {int n;printf("请输入一个数字:");scanf( ...

  7. c语言怎么自定义关机时间,C语言编写简单的定时关机程序

    搜索热词 写一个定时关机的小程序,可以立即关闭计算机,也可以一段时间后关闭计算机. 这里主要考察system()命令. 代码实现: #include #include #include int mai ...

  8. 恶作剧c语言程序,自己用C语言编写的一个恶作剧小程序代码

    自己用C语言编写的一个恶作剧小程序代码 #include #include #include #define MAX 100 void hebingString(char s1[],char s2[] ...

  9. 163vip邮箱账号登录入口在哪儿?163邮箱登录不了怎么办?

    生活不止眼前的苟且,还有诗和远方-初入职场的你可能连办公软件都不能熟练使用,邮箱登录地址不清楚怎么写.不晓得163vip邮箱账号登录入口在哪儿.不知道邮箱登录不了该怎么办.更不知道发错邮件该怎么办,到 ...

最新文章

  1. 力扣(LeetCode)刷题,简单题(第7期)
  2. 详解vue生命周期及每个阶段适合进行的操作
  3. wpf(第一个应用实例)
  4. Keepalived+nginx+redis主从+tomcat一机多实例实现会话共享
  5. 笔记本指纹识别linux版驱动程序,联想Thinkpad指纹识别驱动
  6. aistudio下载文件避免报错
  7. CAS算法中的ABA问题的解决
  8. 网站+云服务器+价格表,网站+云服务器+价格表
  9. ecshop 配置服务器文件夹,ECSHOP3.6安装教程【ECSHOP3.6安装教程步骤】ECSHOP3.6安装教程详细讲解-ECSHOP教程网...
  10. 处理器的排名_齐齐哈尔LPCVD尾气处理器排名推荐
  11. 限时免费领取育碧75元游戏《纪元Anno1404:历史版》
  12. Lambda 表达式
  13. 怎么把ofd转换成PDF文件?分享给你个好用的方法。
  14. 局域网bs虚拟服务器怎么创建,搭建局域网地图服务器
  15. 阅读笔记--现代操作系统
  16. python绘制曲线y=2x+5_Python绘制简易的二维图像
  17. C语言基础 输出月份名 问题
  18. 使用synergy/barrier服务端和客户端连接不上的问题
  19. 《Python数据分析基础教程:NumPy学习指南(第2版)》笔记1:第一章 NumPy快速入门
  20. android录音波浪动画_Android实现炫酷的波浪下载Loading动画

热门文章

  1. Compass的用法
  2. a标签 rel=‘nofollow‘
  3. html canvas 开发工具,基于js的html canvas工具包:cantool
  4. 百度产品笔试题 答案
  5. rabbitmq java 测试_RabbitMQ 简单测试
  6. 给定三角形边长,求三角形面积
  7. 有关于3GPP SUL的一些学习
  8. 场景建造软件_有效地构建。 建造者关于有目的地交付软件的观点
  9. 【网络安全科普】infra工程师 网络科普
  10. PANSS 阳性与阴性症状量表