7-8 Email Address (30 分)
常常需要检查一个电子邮件地址是否合法。在Internet standards RFC 5321和RFC 5322中规定了电子邮件地址的格式。一个电子邮件地址是由@分割成local-part和domain两部分的字符串,即local-part@domain。一个电子邮件地址的local-part至多64个字符,而domain至多253个字符。 local-part可以使用下面的任何ASCII字符:
- 大小写字母(a-z, A-Z)
- 数字(0-9)
- 连字符(-)、下划线(_)、句点(.),但是不能出现在第一个字符,也不能出现在最后一个字符,也不能连续出现两次或两次以上。
domain可以使用下面的任何ASCII字符:
- 大小写字母(a-z, A-Z)
- 数字(0-9)
- 句点(.),但是不能出现在第一个字符,也不能出现在最后一个字符,也不能连续出现两次或两次以上。
根据上面的规定,[email protected]是一个合法的邮件地址,而[email protected]和qin[cs]@gzu.edu.cn都是非法的邮件地址。
输入格式:
输入文件有多个测试数据。每个测试数据占一行,文件最后一行为over意味着输入结束。
输出格式:
对每一行的字符串,判断是否为合法的电子邮件地址,如果合法输出legal,否则输出illegal。
输入样例:
[email protected] Abc.gzu.edu.cn [email protected] A@b@[email protected] ()[]\;:,<>@163.com over
输出样例:
legal illegal legal illegal illegal
总结:
这就是一道字符串的模拟题,用到的就是些循环判断,并没有考察什么算法,所以说我们只需要保持思路清晰,即可做出,需要注意的点是,这道题代码量较多,循环判断较为繁琐,在写之前最好能把解题思路写下来,再将思路转化为代码,我想这样会节约很多时间,这道题我用了一个小时20分钟写完的,要是在正规比赛中肯定是失败的,所以下次写字符串的题就要速战速决
以下AC代码:
#include<iostream>
#include<string>
using namespace std;
int main(){
while(1){
string s;
cin>>s;
if(s[0]=='o'&&s[1]=='v'&&s[2]=='e'&&s[3]=='r'){
break;
}
int cnt1=0,cnt2=0;//cnt1用于计算第一部分长度,cnt2用于计算第二部分长度
bool flag1=0,flag2=0;//flag1用于判断是否有@,flag2用于判断是否符合规范
for(int i=0;i<s.size();i++){//for循环用于查找@
if(s[i]=='@'){
if(i>64){
cout<<"illegal"<<endl;
break;
}
else {
flag1=1;
break;
}
}
}
//cout<<"判断1完成"<<endl;
if(flag1){
// cout<<"*******************"<<endl;
for(int i=0;i<s.size();i++){
// cout<<"&&&&&&&"<<endl;
if((s[i]>=65&&s[i]<=90)||(s[i]>=97&&s[i]<=122)
||(s[i]>=48&&s[i]<=57)){
cnt1++;
continue;
}
else if(s[i]=='-'||s[i]=='_'||s[i]=='.'){
if(s[i]=='-'&&s[i-1]=='-'){
cout<<"illegal"<<endl;
break;
}
else if(s[i]=='_'&&s[i-1]=='_'){
cout<<"illegal"<<endl;
break;
}
else if(s[i]=='.'&&s[i-1]=='.'){
cout<<"illegal"<<endl;
break;
}else{
cnt1++;
}
}
else if(s[i]=='@'){
if(s[0]=='-'||s[0]=='_'||s[0]=='.'
||s[cnt1]=='-'||s[cnt1]=='_'||s[cnt1]=='.'){
cout<<"illegal"<<endl;
}
break;
}else{
cout<<"illegal"<<endl;
break;
}
}
// cout<<"cnt1="<<cnt1<<endl;
if(s[cnt1]=='@'){
// cout<<"@@@@@@@@@@@@@@@@"<<endl;
for(int i=cnt1+1;i<s.size();i++){
if(cnt2>253){
cout<<"illegal"<<endl;
break;
}
else if((s[i]>=65&&s[i]<=90)||(s[i]>=97&&s[i]<=122)
||(s[i]>=48&&s[i]<=57)){
cnt2++;
continue;
}
else if(s[i]=='.'){
if(s[i]=='.'&&s[i-1]=='.'){
cout<<"illegal"<<endl;
break;
}
}
else{
cout<<"illegal"<<endl;
break;
}
flag2=1;
//cout<<"legal"<<endl;
}
// cout<<"cnt2="<<cnt2<<endl;
if(flag2){
cout<<"legal"<<endl;
}
}
}
else{
cout<<"illegal"<<endl;
}
}
}