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 展开
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 展开
3个回答
展开全部
#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也是能校验过的.
展开全部
#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;
}
#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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询