sicily--1133. SPAM

来源:互联网 发布:睡过十几个女同学 知乎 编辑:程序博客网 时间:2024/05/23 15:43

  1. 题目不难,但是真的调试到我心都碎了
  2. 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“、”_“、”-“、”.“的检查
  3. 我觉得这道题关键的是有两个地方
    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为46int 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;}


原创粉丝点击