Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
0 / 0 / 2
Регистрация: 24.05.2017
Сообщений: 87

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

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

Студворк — интернет-сервис помощи студентам
Есть вот такая задача
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)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.09.2017, 01:47
Ответы с готовыми решениями:

Проверка email
Всем доброго времени суток! Задача видна по заголовку темы. в общем у меня сейчас картина такая #include &lt;iostream&gt; using...

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

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

29
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
13.09.2017, 01:56
Лучший ответ Сообщение было отмечено 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  [ТС]
nd2,
извините а не могли бы в 2 словах объяснить зачем использовать булевый flag ? как я понимаю если if str[i] != '@'
если в строке нет @ то выведи Nekorektniy simvol no is @
и зачем тут нужен flag не могу понять
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
13.09.2017, 02:25
Цитата Сообщение от 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  [ТС]
nd2, то есть флаг работает грубо говоря как переключатель при нахождение ,или отсутствие символа в строке?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
13.09.2017, 03:06
Цитата Сообщение от alex14058 Посмотреть сообщение
тоесть флаг работает грубо говоря как переключатель при нахождение ,или отсутствие символа в строке?
Флаг - это не переключатель. Сигнализатор, ориентир, знак.

Добавлено через 6 минут
Хотя, может быть, и переключателем (с двумя состояниями) можно назвать, это как переключатель понимать.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
13.09.2017, 07:28
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
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
13.09.2017, 11:27
GbaLog-, с такой строчкой результат будет std::true
C++
1
CHECK_EMAIL("gbalog@.", false);
0
Заклинатель змей
 Аватар для DobroAlex
705 / 560 / 219
Регистрация: 30.04.2016
Сообщений: 2,605
13.09.2017, 11:32
Не проще через регулярные выражения?
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
13.09.2017, 11:35
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
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
13.09.2017, 11:47
Цитата Сообщение от 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
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
13.09.2017, 11:49
GbaLog-, под std::true я понимаю логический литерал bool)
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
13.09.2017, 11:49
Ferrari F1, ваш код не проходит все тесты.
http://rextester.com/BKLU99374
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
13.09.2017, 12:13
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  [ТС]
спасибо) через регулярные ворожения я делал.и там понятное дело проще будет)
теперь не могу проверить 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
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
13.09.2017, 19:26
Цитата Сообщение от alex14058 Посмотреть сообщение
сделал все по аналоги как показал nd2
К тому что и как ты сделал, я отношения не имею.
0
0 / 0 / 2
Регистрация: 24.05.2017
Сообщений: 87
13.09.2017, 20:19  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
К тому что и как ты сделал, я отношения не имею.
я без каких либо претензий,спасибо большое что помогли
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
13.09.2017, 20:51
Цитата Сообщение от alex14058 Посмотреть сообщение
C++
1
str[i] =='mail'
Символ сравниваешь неизвестно с чем.
0
0 / 0 / 2
Регистрация: 24.05.2017
Сообщений: 87
14.09.2017, 01:17  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Символ сравниваешь неизвестно с чем.
получается нужно mail разбить на части, или сделать поиск через с find()
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
14.09.2017, 06:23
alex14058, вобще, сперва надо все символы email'а сравнить на допустимые символы, например,
в нем могут быть собака, точки, дефисы, нижние подчеркивания, но не может быть запятых и прочих знаков пунктуации,
а только потом уже разбивать на части.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.09.2017, 06:23
Помогаю со студенческими работами здесь

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

Проверка email
Пытался сделать проверку email, но почему то не работает. Подскажите где ошибка? $('#sign_email').keyup(function(){ var email =...

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru