C++ фильтр спама

В SGU есть проблема ( проблема 274).

Задача - написать простой email-валидатор.

Действительный адрес электронной почты можно описать следующим образом:

[буква]:: = 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

_@-.RU


Выход

НЕТ

ДА

ДА


1 ответ

Вы должны объяснить, насколько неверен ваш вывод, но я запускаю ваш код, он работает для правил, и, возможно, вы забыли установить ans[i] все false при запуске, верно? Потому что их мусорная ценность может привести к этим проблемам.

Как я уже сказал, сначала он работает нормально для вашего CFG. Если вы имеете в виду, что он проверяет действительный адрес электронной почты, например, что-то вроде "some@ss.ss.ss.ss.ss.ss.ss" с "неправильным ответом", это ваша проблема с CFG. Последнее, что есть класс регулярных выражений в C++, вы можете попробовать это тоже.

Я надеюсь, что это может помочь вам.

Другие вопросы по тегам