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++, вы можете попробовать это тоже.
Я надеюсь, что это может помочь вам.