【问题标题】:C++ Spam filterC++ 垃圾邮件过滤器
【发布时间】: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


【解决方案1】:

你应该解释你的输出有多么错误,但我运行你的代码它适用于规则,也许你忘了在开始时将 ans[i] 设置为 false 对吗?因为它们的垃圾值可能会导致这些问题。

正如我所说,起初它对您的 CFG 运行良好。如果您的意思是它验证有效的电子邮件,例如“something@ss.ss.ss.ss.ss.ss.ss”和“错误答案”,它是你的CFGs问题。最后一件事是c++有正则表达式类,你也可以试试。

希望对你有帮助。

【讨论】:

  • 谢谢,真的很有帮助。
猜你喜欢
  • 1970-01-01
  • 2011-04-21
  • 2019-09-19
  • 2012-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
  • 2015-03-06
相关资源
最近更新 更多