C语言编程,给定一个Email地址,判断其是否合法

mail地址的格式要求如下:ps:C89内核(实在不行C99也可以)(1)Email地址包含2个部分,分别是用户名和域名,中间用符号“@”分隔,且要求用户名和域名均至少有... mail地址的格式要求如下:
ps:C89内核(实在不行C99也可以)
(1)Email地址包含2个部分,分别是用户名和域名,中间用符号“@”分隔,且要求用户名和域名均至少有1个字符。
(2)用户名和域名只能由大小写字母、0至9的数字、下划线“_”或点号“.”组成。
(3)用户名和域名中的点号“.”都要求前后必须有其他合法的字符,如carter.chen@163.com是合法的,但carter.chen.@163.com和carter..chen@163.com是不合法的。

输入
输入数据包含多组,第一行为数据的组数T,接下来有T组数据,每组占一行,每行是一个字符串,长度不超过100个字符。
输出
如果是合法的Email地址,则输出Yes,否则输出No。
样例输入
3
carter.chen@163.com
carter.chen.@163.com
carter..chen@163.com
样例输出
Yes
No
No
展开
 我来答
旷野行风
2017-03-07 · TA获得超过366个赞
知道小有建树答主
回答量:302
采纳率:33%
帮助的人:234万
展开全部
#include<stdio.h>
#include<string.h>
int FormatCheck(char *);
char * SplitByAt(char * ,int);
char * CharsCheck(char *);
#define N 1024
int main()
{
    char str[N],*field;
    memset(str,0x00,N);
    scanf("%s",str);
    field=SplitByAt(str,N);
    if(field==NULL)
    {
        printf("NO\n");
        return -1;
    }
    else if(FormatCheck(str)&&FormatCheck(field))
    {
        printf("YES\n");
        return 0;
    }
    else
    {
        printf("NO\n");
        return -1;
    }
}
/**
 *校验域名/邮箱格式
 */
 int FormatCheck(char *str)
 {
     char *p;
     for(;;)
     {
         p=CharsCheck(str);
         if(p==str)
         {
             return 0;
         }
         else if(*p=='\0')
         {
             return 1;
         }
         else if(*p!='.')
         {
             return 0;
         }
         p++;
         str=p;
     }
 }       
/**
 *校验是否可用@分割为两段,返回域名首地址,不合要求返回NULL
 *参数:str,源字符串,length,长度限制(防越界)
 *函数会用'\0'代替源字符串第一个'@',已完成邮箱,域名分割.
 */
char *SplitByAt(char *str,int length)
{
    char *p=strchr(str,'@');
    if(p!=NULL&&(p-str)<length)
    {
        *p=0;
        p++;
        return p;
    }
    return NULL;
}
/**
 *校验str是否为连续的'a'-'z','A'-'Z','0'-'9'字符
 *返回值:第一个不合要求的字符所处位置
 *例如:str="abc",返回str+3; str="a#bc",返回str+1;
 */
char * CharsCheck(char *str)
{
    while((*str>='a'&&*str<='z')||
        (*str>='A'&&*str<='Z')||
        (*str>='0'&&*str<='9')||
         *str=='_')
    {
        str++;
    }
    return str;
}

要求没有提'_'符号的特殊规则, 所以"__.__@_"这样的email也是能校验过的.

xoaxa
2017-03-07 · TA获得超过8611个赞
知道大有可为答主
回答量:6415
采纳率:72%
帮助的人:3489万
展开全部
#include<stdio.h>
#include<string.h>

int islegal(char ch) {
if(ch == '.'|| ch == '_') return 1;
else if(ch >= '0' && ch <= '9') return 1;
else if(ch >= 'a' && ch <+ 'z') return 1;
else if(ch >= 'A' && ch <= 'Z') return 1;
else if(ch == '@') return 1;
return 0;
}

int afew(char s[],char ch) { // 返回串中有几个字符ch
int i = 0,n = 0;
while(s[i]) {
if(ch == s[i]) ++n;
++i;
}
return n;
}

int pos(char s[],char ch) {
int i = 0;
while(s[i] != ch && s[i]) ++i;
if(s[i] == '\0') return -1;
return  i;
}

int main() {
char email[101];
int T,i,p,flag = 0;
scanf("%d",&T);
while(T--) {
flag = 1;
fflush(stdin);
scanf("%s",email);
for(i = 0; email[i] && islegal(email[i]); ++i);
if(email[i] == '\0' && afew(email,'@') == 1) {
flag = 1;
if((p = pos(email,'.')) > 0) {
flag = 1;
if(email[p - 1] != '.' && email[p + 1] != '.') {
flag = 1;
p = pos(email,'@');
if(email[p - 1] != '.' && email[p + 1] != '.')
flag = 1;
printf("YES\n");
}
else flag = 0;
}
else flag = 0;
}
else flag = 0;
if(flag == 0) printf("NO\n");
}
return 0;
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2017-08-11
展开全部
#include<stdio.h>
#include<string.h>
int FormatCheck(char *);
char * SplitByAt(char * ,int);
char * CharsCheck(char *);
#define N 1024
int main()
{
char str[N],*field;
memset(str,0x00,N);
scanf("%s",str);
field=SplitByAt(str,N);
if(field==NULL)
{
printf("NO\n");
return -1;
}
else if(FormatCheck(str)&&FormatCheck(field))
{
printf("YES\n");
return 0;
}
else
{
printf("NO\n");
return -1;
}
}
/**
*校验域名/邮箱格式
*/
int FormatCheck(char *str)
{
char *p;
for(;;)
{
p=CharsCheck(str);
if(p==str)
{
return 0;
}
else if(*p=='\0')
{
return 1;
}
else if(*p!='.')
{
return 0;
}
p++;
str=p;
}
}
/**
*校验是否可用@分割为两段,返回域名首地址,不合要求返回NULL
*参数:str,源字符串,length,长度限制(防越界)
*函数会用'\0'代替源字符串第一个'@',已完成邮箱,域名分割.
*/
char *SplitByAt(char *str,int length)
{
char *p=strchr(str,'@');
if(p!=NULL&&(p-str)<length)
{
*p=0;
p++;
return p;
}
return NULL;
}
/**
*校验str是否为连续的'a'-'z','A'-'Z','0'-'9'字符
*返回值:第一个不合要求的字符所处位置
*例如:str="abc",返回str+3; str="a#bc",返回str+1;
*/
char * CharsCheck(char *str)
{
while((*str>='a'&&*str<='z')||
(*str>='A'&&*str<='Z')||
(*str>='0'&&*str<='9')||
*str=='_')
{
str++;
}
return str;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式