SGU(Problem 274)存在问题。
任务正在编写一个简单的电子邮件验证程序。
有效的电子邮件地址可以描述如下:
[letter] :: = a | b | ... | z | A | B | ... | Z
[符号] :: = [letter] | 0 | 1 | ... | 9 | _ | -
[字] :: = [符号] | [符号] [字]
[前缀] :: = [word] | [前缀] [字]
[域名] :: = [letter] [letter] | [信] [信] [信]
[后缀] :: = [前缀]。[域名]
[地址] :: = [前缀] @ [后缀]
我确信我的验证器工作正常,但我得错了答案。
这是我的验证员:
描述:首先它检查@的电子邮件地址长度和位置。然后它将它分成最大部分,前缀和后缀,并检查它们是否有效。
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 :(得分:0)
你应该解释你的输出有多错,但我运行你的代码它是为规则工作的,也许你忘了设置ans [i]在开始时都是假的?因为他们的垃圾价值可能导致这些问题。
正如我所说,一开始你的CFG运行正常。如果你的意思是它验证有效的电子邮件,如“something@ss.ss.ss.ss.ss.ss.ss”,“错误答案”,它是你的CFG问题。最后还有c ++的regex类,你也可以试试。
我希望它可以帮到你。