0 / 0 / 2
Регистрация: 24.05.2017
Сообщений: 87
1

Проверка email на точность

13.09.2017, 01:47. Показов 2227. Ответов 29
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть вот такая задача
2. Написать ф-цию isEmail, которая принимает строку s, и возвращает результат - является ли строка емейлом.
Чтобы понять, является ли набор символом email адресом, нужно проверить.
1) Имеется знак @
2) После знака @ указан домен (например: gmail, mail, hotmail и т.д.) и через точку зона (ru/com/net и т.д.).
Сделал вот такой код.я понимаю что он далек от идеала)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
#include <string>
using namespace std;
int main()
{       
        string str = "alex@gmail.com";
        int b = 0;
        int state = 0;
        string name = "";
        string host = "";
        string zone = "";
        char s[] = {'*','(',')','+'};
        
        
                
        
        for (int i = 0; i<str.size();i++)
        {
            if(str[i] == '@')
                break;
                b=b+1;
                name=name+str[i];
        }
        for (int i = 0; i<str.size();i++)
             if(str[i] == s[0] || str[i] == s[1] || str[i] == s[2] || str[i] == s[3])
            {
                cout<<"Nekorektniy simvol"<<endl;
                return 0;
                
            }
        for (int i = 0; i<str.size();i++)
             if(str[i] != '@')
            {
                cout<<"Nekorektniy simvol no is @"<<endl;
                return 0;
            }   
            
        
        state = state + 1;
        if (state == 1)
        {
        for (int w = b+1;w<str.size();w++)
        {
            if(str[w] == '@' || str[w] == '.')
                break;
            host=host+str[w];
        }
        state = state + 1;
        if (state == 2)
        {
        bool found=false;
        for (int i = 0;i<str.size(); i++)
        {
            if ( str[i]=='.')
                found=true;
            if(found)
                zone= zone+str[i];
        }
    }
    }
    
    
    cout<<name<<endl;
    cout<<host<<endl;
    cout<<zone;
}
вот тут
C++
1
2
3
4
5
6
        for (int i = 0; i<str.size();i++)
             if(str[i] != '@')
            {
                cout<<"Nekorektniy simvol no is @"<<endl;
                return 0;
            }
хочу вывести что если в mail нет @ выводиться Nekorektniy simvol no is @ условие вроде верное
if(str[i] != '@') но всегда на вывод выходит Nekorektniy simvol no is @ в независимости от того есть @ в строке или нет
хотя в подобном условие все отлично работает
C++
1
2
3
4
5
6
7
        for (int i = 0; i<str.size();i++)
             if(str[i] == s[0] || str[i] == s[1] || str[i] == s[2] || str[i] == s[3])
            {
                cout<<"Nekorektniy simvol"<<endl;
                return 0;
                
            }
или я напутал что то с if-ом?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.09.2017, 01:47
Ответы с готовыми решениями:

Проверка email
Всем доброго времени суток! Задача видна по заголовку темы. в общем у меня сейчас картина такая ...

Проверка синтаксиса Email адреса
Помогите разработать программу, которая вводит адрес электронной почты и проверяет синтаксис...

Проверка email
Здравствуйте такая проблема? написал код на PDO,проверка email пользователя,но код отказывается...

Проверка email
Всем доброго времени суток! Подскажите пожалуйста, как можно проверить email на существование?...

29
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
13.09.2017, 01:56 2
Лучший ответ Сообщение было отмечено alex14058 как решение

Решение

Цитата Сообщение от alex14058 Посмотреть сообщение
C++
1
2
3
4
5
6
7
        for (int i = 0; i<str.size();i++)
        {
            if(str[i] == '@')
                break;
            b=b+1;
            name=name+str[i];
        }
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
        bool flag = false;
        for (int i = 0; i<str.size();i++)
        {
           if(str[i] == '@')
           {
                flag = true;
                break;
           }
                b=b+1;
                name=name+str[i];
        }
        if (!flag)
        {
               cout<<"Nekorektniy simvol no is @"<<endl;
               return 0;
        }
0
0 / 0 / 2
Регистрация: 24.05.2017
Сообщений: 87
13.09.2017, 02:09  [ТС] 3
nd2,
извините а не могли бы в 2 словах объяснить зачем использовать булевый flag ? как я понимаю если if str[i] != '@'
если в строке нет @ то выведи Nekorektniy simvol no is @
и зачем тут нужен flag не могу понять
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
13.09.2017, 02:25 4
Цитата Сообщение от alex14058 Посмотреть сообщение
не могли бы в 2 словах объяснить зачем использовать буливый flag ?
Для того, чтобы, после цикла, можно было понять: есть @ в строке или нет.

Добавлено через 1 минуту
Цитата Сообщение от alex14058 Посмотреть сообщение
как я понимаю если if str[i] != '@'
если в строке нет @ то выведи Nekorektniy simvol no is @
У тебя и выводит:
Цитата Сообщение от alex14058 Посмотреть сообщение
но всегда на вывод выходит Nekorektniy simvol no is @ в независимости от того есть @ в строке или нет
Добавлено через 8 минут
Чтобы определить отсутствие какого-либо символа в строке, нужно перебирать строку или до встречи символа (и делать вход из неё, когда символ найден), или до конца строки. Чтобы потом понять, как был произведён выход из цикла (при нахождении символа или при окончании строки), нужно или добавить флаг, по которому можно это определить, или смотреть на значение индекса цикла после выхода.
0
0 / 0 / 2
Регистрация: 24.05.2017
Сообщений: 87
13.09.2017, 02:55  [ТС] 5
nd2, то есть флаг работает грубо говоря как переключатель при нахождение ,или отсутствие символа в строке?
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
13.09.2017, 03:06 6
Цитата Сообщение от alex14058 Посмотреть сообщение
тоесть флаг работает грубо говоря как переключатель при нахождение ,или отсутствие символа в строке?
Флаг - это не переключатель. Сигнализатор, ориентир, знак.

Добавлено через 6 минут
Хотя, может быть, и переключателем (с двумя состояниями) можно назвать, это как переключатель понимать.
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
13.09.2017, 07:28 7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#include <string>
#include <algorithm>
 
bool isEmail(const std::string & str)
{
    //1) Имеется знак @
    auto it = std::find(str.cbegin(), str.cend(), '@');
    
    if (it == str.cend())
        return false;
    
    //2) После знака @ указан домен
    it = std::find(it, str.cend(), '.');
    
    if (it == str.cend())
        return false;
    
    return true;
}
 
#define CHECK_EMAIL(str, exp)                       \
    {                                               \
        bool res = isEmail(str);                    \
        std::cout                                   \
           << "["                                   \
           << (res == exp ? "SUCCESS" : "FAILED")   \
           << "] Email: '" << str                   \
           << "' (expected: " << exp                \
           << ") result: " << res << "\n";          \
    }
 
int main()
{
    std::cout.setf(std::ios::boolalpha);
    CHECK_EMAIL("ololo@mail.ru", true);
    CHECK_EMAIL(".ololo@mailru", false);
    CHECK_EMAIL("", false);
    CHECK_EMAIL("ha-ha@gmail ru", false);
    CHECK_EMAIL("gbalog@", false);
    CHECK_EMAIL("ur.liam@ololo", false);
}
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
13.09.2017, 11:27 8
GbaLog-, с такой строчкой результат будет std::true
C++
1
CHECK_EMAIL("gbalog@.", false);
0
Заклинатель змей
700 / 555 / 219
Регистрация: 30.04.2016
Сообщений: 2,591
13.09.2017, 11:32 9
Не проще через регулярные выражения?
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
13.09.2017, 11:35 10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <string>
#include <vector>
using namespace std;
 
bool isEmail(string const&);
 
int main()
{
    vector<string> vec
    {
        "ololo@mail.ru",
        ".ololo@mailru",
        "",
        "ha-ha@gmail ru",
        "gbalog@.",
        "ur.liam@ololo.com"
    };
 
    for (auto const& str : vec)
        cout << boolalpha << isEmail(str) << endl;
 
    system("pause");
}
 
bool isEmail(string const& email)
{
    const auto& split = [](string const& str, const char separator, const size_t pos = 0)
        -> pair<bool, size_t>
    {
        size_t signPos{ str.find(separator, pos) };
        bool success{
            signPos != string::npos &&
            signPos > pos &&
            signPos < str.size() - 1 &&
            signPos == str.rfind(separator)
        };
 
        if (!success)
            signPos = string::npos;
 
        return{ success, signPos };
    };
 
    auto pairRes = split(email, '@');
    if (!pairRes.first)
        return false;
 
    pairRes = split(email, '.', pairRes.second);
    if (!pairRes.first)
        return false;
 
    return true;
}
Цитата Сообщение от DobroAlex Посмотреть сообщение
Не проще через регулярные выражения?
DobroAlex, если бы я их знал
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
13.09.2017, 11:47 11
Цитата Сообщение от DobroAlex Посмотреть сообщение
Не проще через регулярные выражения?
нельзя e-mail проверить через регулярки, об этом даже статья на хабре есть.
https://habrahabr.ru/post/175375/
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
с такой строчкой результат будет std::true
это легко исправить.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bool isEmail(const std::string & str)
{
    //1) Имеется знак @
    auto at = std::find(str.cbegin(), str.cend(), '@');
    
    if (at == str.cend())
        return false;
    
    //2) После знака @ указан домен
    auto dot = std::find(at, str.cend(), '.');
    
    if (dot == str.cend() ||       // точки нет
        str.cend() - dot == 1 ||   // точка в конце
        dot - at == 1)             // между точкой и собакой нет символов
        return false;
    
    return true;
}


P.S. не существует std::true, есть только std::true_type.
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
13.09.2017, 11:49 12
GbaLog-, под std::true я понимаю логический литерал bool)
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
13.09.2017, 11:49 13
Ferrari F1, ваш код не проходит все тесты.
http://rextester.com/BKLU99374
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
13.09.2017, 12:13 14
GbaLog-, вай, сдаюс-сдаюс)

Добавлено через 4 минуты
Тогда в моем коде нужно изменить
C++
1
pairRes = split(email, '.', pairRes.second);
на
C++
1
pairRes = split(email, '.', ++pairRes.second);
Хотя правильнее бы вносить изменения в код вызываемой стороны, а не вызывающей, как я сделал)
0
0 / 0 / 2
Регистрация: 24.05.2017
Сообщений: 87
13.09.2017, 19:22  [ТС] 15
спасибо) через регулярные ворожения я делал.и там понятное дело проще будет)
теперь не могу проверить gmail, mail, hotmai
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
// ConsoleApplication26.cpp: определяет точку входа для консольного приложения.
//
 
#include <iostream>
#include <string>
using namespace std;
int main()
{
    string str = "alex@mail.com";
    int b = 0;
    int state = 0;
    string name = "";
    string host = "";
    string zone = "";
    char s[] = { '*','(',')','+' };
 
 
 
 
    for (int i = 0; i<str.size();i++)
    {
        if (str[i] == '@')
            break;
        b = b + 1;
        name = name + str[i];
    }
    cout << name << endl;
//  bool flags = false;
    for (int i = 0; i<str.size();i++)
        if (str[i] == s[0] || str[i] == s[1] || str[i] == s[2] || str[i] == s[3])
        {
            cout << "Nekorektniy simvol" << endl;
            return 0;
        }
 
 
    state = state + 1;
    if (state == 1)
    {
        for (int w = b + 1;w<str.size();w++)
        {
            if (str[w] == '@' || str[w] == '.')
                break;
            host = host + str[w];
        }
        bool flag = false;
        for (int i = 0; i<str.size();i++)
        {
           if(str[i]== '@')
           {
                flag = true;
                break;
           }
                b=b+1;
                name=name+str[i];
            }
            
            if (!flag)
            {
               cout<<"Nekorektniy simvol no is @"<<endl;
               return 0;
            }
        bool flag1 = false;
        for (int i = 0; i<str.size();i++)
        {
           if(str[i] =='mail'||str[i] =='mail'||str[i] =='hotmai'||str[i] =='gmail')
           {
                flag1 = true;
                break;
           }
            
           if (!flag1)
           {
               cout<<"Nekorektniy simvol no is boxhome"<<endl;
               return 0;
           }
        }
        state = state + 1;
        if (state == 2)
        {
            bool found = false;
            for (int i = 0;i<str.size(); i++)
            {
                if (str[i] == '.')
                    found = true;
                if (found)
                    zone = zone + str[i];
            }
        }
    }
 
 
    
    cout << host << endl;
    cout << zone;
}
сделал все по аналоги как показал nd2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        bool flag1 = false;
        for (int i = 0; i<str.size();i++)
        {
           if(str[i] =='mail'||str[i] =='mail'||str[i] =='hotmai'||str[i] =='gmail')
           {
                flag1 = true;
                break;
           }
            
           if (!flag1)
           {
               cout<<"Nekorektniy simvol no is boxhome"<<endl;
               return 0;
           }
        }
но видемо где то напутал на выходе "Nekorektniy simvol no is boxhome" все время.
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
13.09.2017, 19:26 16
Цитата Сообщение от alex14058 Посмотреть сообщение
сделал все по аналоги как показал nd2
К тому что и как ты сделал, я отношения не имею.
0
0 / 0 / 2
Регистрация: 24.05.2017
Сообщений: 87
13.09.2017, 20:19  [ТС] 17
Цитата Сообщение от nd2 Посмотреть сообщение
К тому что и как ты сделал, я отношения не имею.
я без каких либо претензий,спасибо большое что помогли
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
13.09.2017, 20:51 18
Цитата Сообщение от alex14058 Посмотреть сообщение
C++
1
str[i] =='mail'
Символ сравниваешь неизвестно с чем.
0
0 / 0 / 2
Регистрация: 24.05.2017
Сообщений: 87
14.09.2017, 01:17  [ТС] 19
Цитата Сообщение от nd2 Посмотреть сообщение
Символ сравниваешь неизвестно с чем.
получается нужно mail разбить на части, или сделать поиск через с find()
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
14.09.2017, 06:23 20
alex14058, вобще, сперва надо все символы email'а сравнить на допустимые символы, например,
в нем могут быть собака, точки, дефисы, нижние подчеркивания, но не может быть запятых и прочих знаков пунктуации,
а только потом уже разбивать на части.
0
14.09.2017, 06:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.09.2017, 06:23
Помогаю со студенческими работами здесь

Проверка email
Пытался сделать проверку email, но почему то не работает. Подскажите где ошибка?...

Проверка email
Здравствуйте. Объясните пожалуйста по чему не работает? if(!preg_match(&quot;/^+**@(+(*+)*\.)++/i&quot;,...

Не работает проверка на email
Не работает проверка на email при регистрации! $sql_proverka = mysql_query(&quot;SELECT email,...

Preg_match и проверка email
Здравствуйте ребята Такое дело: Сменил версию PHP на седьмую на Wordpress блоге и перестала...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru