- 题目不难,但是真的调试到我心都碎了
while(s[i] == 45 || s[i] == 95 || (s[i] >= 48 && s[i] <= 57) ||(s[i] >= 97 && s[i] <= 122) || (s[i] >= 65 && s[i] <= 90) || s[i] == 46)//符合地址
用以判断是否符合邮箱地址的规范,包含了“0 - 9 ”、“A - Z‘、”a - z“、”_“、”-“、”.“的检查- 我觉得这道题关键的是有两个地方
a)当前字符是"."的操作,判断head 或者是 tail 是否是以"."为结尾而进行不同的操作
if((i + 1 == s.length()) || (s[i + 1] == 46) || (s[i] != 45 && s[i] != 95 && s[i] < 48 && s[i] > 57 && s[i] < 65 && s[i] > 90 && s[i] < 97 && s[i] > 122))//以"."结尾
b)若下一个字符是"@"的操作,保留上一个合法邮箱地址的 tail 当作下一个地址的head, 且要让程序再次从该”@“处开始判断
if(s[i] == 64)
{
head = tail;//因为下一个字符是"@",又可以有一个邮箱地址
tail = "";
i--;//让程序重新在"@"处开始检查
}
#include<iostream>
#include<string>
using namespace std;
//"-"连接符的ASCII 为45
//"_"下划线的ASCII为95
//"0"的ASCII为48, "9"的ASCII为57
//"a"的ASCII为97, "z"的ASCII为122
//"A"的ASCII为65, "Z"的ASCII为90
//"@"的ASCII为64
//"."的ASCII为46
int main()
{
string s;
while(cin >> s)
{
string head;//@之前
string tail;//@之后
for(int i = 0; i < s.length(); i++)
{
if(s[i] == 46)//以'.'开头
{
head = "";
tail = "";
}
else
{
//不是以"."开头
while(s[i] == 45 || s[i] == 95 || (s[i] >= 48 && s[i] <= 57) ||(s[i] >= 97 && s[i] <= 122) || (s[i] >= 65 && s[i] <= 90) || s[i] == 46)//符合地址
{
if(s[i] == 46 )//"."
{
if((i + 1 == s.length()) || (s[i + 1] == 46) || (s[i] != 45 && s[i] != 95 && s[i] < 48 && s[i] > 57 && s[i] < 65 && s[i] > 90 && s[i] < 97 && s[i] > 122))//以"."结尾
{
break;
}
}
head.push_back(s[i]);//取前缀
i++;
if(i == s.length())
break;
}
if(head.empty())
continue;
if(i == s.length())
break;
//有头了
if(s[i] == 64)//紧接着的是@
{
i++;
if(i == s.length())//在“@”后面没有字符了
break;
while(s[i] == 45 || s[i] == 95 || (s[i] >= 48 && s[i] <= 57) ||(s[i] >= 97 && s[i] <= 122) || (s[i] >= 65 && s[i] <= 90) || s[i] == 46)//符合地址
{
if(s[i] == 46 )//"."
{
if((i + 1 == s.length()) || (s[i + 1] == 46) || (s[i] != 45 && s[i] != 95 && s[i] < 48 && s[i] > 57 && s[i] < 65 && s[i] > 90 && s[i] < 97 && s[i] > 122))//以"."结尾
{
break;
}
}
tail.push_back(s[i]);//取后缀
i++;
if(i == s.length())
break;
}
if(head.empty() || tail.empty())
break;
cout << head << "@" << tail << endl;//输出当前邮箱地址
if(i == s.length())
break;
if(s[i] == 64)
{
head = tail;//因为下一个字符是"@",又可以有一个邮箱地址
tail = "";
i--;//让程序重新在"@"处开始检查
}
}
else//紧接着的不是@,则前缀已无用
{
head.clear();
tail.clear();
}
}
}
}
return 0;
}