C ++垃圾邮件过滤器

时间:2014-07-25 10:55:57

标签: c++ validation email-validation

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


输出


1 个答案:

答案 0 :(得分:0)

你应该解释你的输出有多错,但我运行你的代码它是为规则工作的,也许你忘了设置ans [i]在开始时都是假的?因为他们的垃圾价值可能导致这些问题。

正如我所说,一开始你的CFG运行正常。如果你的意思是它验证有效的电子邮件,如“something@ss.ss.ss.ss.ss.ss.ss”,“错误答案”,它是你的CFG问题。最后还有c ++的regex类,你也可以试试。

我希望它可以帮到你。