【发布时间】:2014-09-17 05:09:07
【问题描述】:
SGU (Problem 274) 出现问题。
任务正在编写一个简单的电子邮件验证器。
有效的电子邮件地址可以描述如下:
[字母] ::= a|b|...|z|A|B|...|Z
[符号] ::= [字母] |0|1|...|9|_|-
[单词] ::= [符号] | [符号][单词]
[前缀] ::= [单词] | [前缀].[单词]
[域] ::= [字母][字母] | [字母][字母][字母]
[后缀] ::= [前缀].[域]
[地址] ::= [前缀]@[后缀]
我确定我的验证器工作正常,但我得到了错误的答案。
这是我的验证器:
说明:首先检查电子邮件地址的长度和@的位置。然后它将它分成最大的部分,前缀和后缀,并检查它们是否有效。
bool check(string command, int k, int f, int l)
{
/*
command: it is "prefix" or "suffix"
k: index of the email (There are several email addresses)
f: first of the string
l: end of the string
*/
if(f > l) return false;
if(command == "prefix")
{
for(int i = f ; i <= l ; i++)
{
if(s[k][i]-'A' < 26 && s[k][i]-'A' >= 0) continue;
if(s[k][i]-'a' < 26 && s[k][i]-'a' >= 0) continue;
if(s[k][i]-'0' < 10 && s[k][i]-'0' >= 0) continue;
if(s[k][i] == '-' || s[k][i] == '_') continue;
if(s[k][i] == '.' && i < l && i > f) continue;
return false;
}
return true;
}
if(command == "suffix")
{
if(s[k][l-2] != '.' && s[k][l-3] != '.') return false;
int dot = (s[k][l-2] == '.')? l-2 : l-3;
for(int i = dot+1 ; i <= l ; i++)
{
if(s[k][i]-'A' < 26 && s[k][i]-'A' >= 0) continue;
if(s[k][i]-'a' < 26 && s[k][i]-'a' >= 0) continue;
return false;
}
if(check("prefix", k, f, dot-1)) return true;
return false;
}
}
void solve()
{
int at;
for(int i = 1 ; i <= n ; i++)
{
if(s[i].length() < 6)
continue;
at = 0;
for(int j = 1 ; j < s[i].length()-4 ; j++)
if(s[i][j] == '@')
{
at = j;
break;
}
if(!at) continue;
if(check("prefix", i, 0, at-1) && check("suffix", i, at+1, s[i].length()-1))
ans[i] = true;
}
}
样本测试:
输入
3
abc@abc
abc@abc.abc
_@-.ru
输出
否
是的
是
【问题讨论】:
-
您能否更准确地说明您的答案是如何错误的?
-
字符串的第一个索引是0,最后一个索引是n-1,其中n是字符串。
-
您的有效地址语法已高度简化。您可能想检查例如this old SO question and its answers.
-
遗憾的是没有关于测试用例的信息。是的,第一个索引是0,最后一个是n-1
标签: c++ validation email-validation