Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
Bevz Slava
0 / 0 / 0
Регистрация: 07.11.2016
Сообщений: 15
1

Нужно проверить на корректность ввода E-mail адреса

08.11.2016, 17:08. Просмотров 552. Ответов 17
Метки нет (Все метки)

Допустим пользователь вводит _____@___.___
Как мы можем проверить эти три ↑ ..... ↑.... ↑
поля на корректность? Во всех не меньше 1, и в первом не больше 15 символов во втором не больше п'яти, в третьем не больше трёх. И как сделать что-бы были последние два только в виде символов?
Как это сделать в виде кода?
Если можно напишите код и обьясните если будет в этом необходимость.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2016, 17:08
Ответы с готовыми решениями:

Проверить корректность ввода
Постройте функции для запроса и чтения ФИО, почтового адреса и даты, и проверьте корректность ввода.

Проверить корректность ввода элементов матрицы
Ввод элементов матрицы А(m, n) осуществляется в произвольном порядке тройками чисел < i, j, Aij>....

Проверка введенного url адреса на корректность
Здравствуйте, требуется ваша помощь не могли бы подсказать как организовать проверку введенного...

Функция для проверки ip адреса на корректность
всем привет. Я тут новенький и вообще новачок в программировании. Не могли бы вы мне помочь с...

Проверка e-mail адреса на корректность
Подскажите название метод проверки e-mail адреса на корректность. Типа наличие символов @ . и т.д,...

17
gazlan
3162 / 1921 / 312
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
08.11.2016, 17:29 2
2
MrGluck
Модератор
Эксперт CЭксперт С++
8114 / 4966 / 1436
Регистрация: 29.11.2010
Сообщений: 13,456
08.11.2016, 18:24 3
Проверка корректности email адреса для плюсов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <regex>
#include <string>
 
bool CheckEmail(const std::string &str)
{
    return std::regex_match(str, std::regex("([\\w-\\.]+)@((?:\\w+\\.)+)([a-zA-Z]{2,4})"));
}
 
int main()
{
    std::cout << std::boolalpha << CheckEmail("abra@a.ruuqq") << std::endl;
}
0
Maxim Prishchepa
Эксперт С++
1926 / 1038 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
08.11.2016, 18:26 4
если мне память не изменяет, то трушная регулярка которая проверяет на валидность E-Mail занимает 100500 строк, вы определитесь вам реально нужно проверить, валидный ли e-mail, или просто соответствует ли он вашим глубого субъективным требованиям?
0
Bevz Slava
0 / 0 / 0
Регистрация: 07.11.2016
Сообщений: 15
08.11.2016, 19:14  [ТС] 5
Maxim Prishchepa, Мне только что-бы входило в эти диапазоны, и условия выполнялись, первый курс как не крути)

Добавлено через 4 минуты
MrGluck, в какой среде вы программировали? У меня ошибки выходят.
0
Maxim Prishchepa
Эксперт С++
1926 / 1038 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
08.11.2016, 19:19 6
регулярки вроде в 11-м стандарте появились, скорее всего из-за этого... ну и ошибку бы кинули, было-бы легче
0
Bevz Slava
0 / 0 / 0
Регистрация: 07.11.2016
Сообщений: 15
08.11.2016, 19:21  [ТС] 7
C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\4.9.2\include\c++\bits\c++0x_warning.h|32|error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.|
D:\Code blocks\1\Вторая лаба\2-z1.cpp||In function 'bool CheckEmail(const string&)':|
D:\Code blocks\1\Вторая лаба\2-z1.cpp|7|error: 'regex_match' is not a member of 'std'|
D:\Code blocks\1\Вторая лаба\2-z1.cpp|7|error: 'regex' is not a member of 'std'|
||=== Build failed: 3 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
Если что-то не то кинул, прошу простить)
0
Maxim Prishchepa
Эксперт С++
1926 / 1038 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
08.11.2016, 19:29 8
если преподу шоб сдать, то тогда скорее всего от вас хотят увидеть что-то по типу:

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
#include <string>
#include <sstream>
#include <vector>
 
void split(const std::string &s, char delim, std::vector<std::string> &elems) {
    std::stringstream ss;
    ss.str(s);
    std::string item;
    while (std::getline(ss, item, delim)) {
        elems.push_back(item);
    }
}
 
 
std::vector<std::string> split(const std::string &s, char delim) {
    std::vector<std::string> elems;
    split(s, delim, elems);
    return elems;
}
 
bool isValid(string email)
{
     vector<string> stepOne = email.split(email, '@');
     if (stepOne.size() != 2)
     {
          return false;
     }
     if (stepOne[0].size() < 1 || stepOne[0].size() >15)
     {
           return false;
     }
     vector<string> stepTwo = split(stepOne[1], '.');
     if (stepTwo.size() != 2)
     {
           return false;
     }
     if (stepTwo[0].size() < 1 || stepTwo[0].size() > 5)
     {
          return false;
     }
 
     if (stepTwo[1].size() < 1 || stepTwo[1].size > 3)
     {
           return false;
     }
     return true;
}
 
void main()
{
     string email = "test@email.add";
     bool result = isValid(email);
}
Добавлено через 55 секунд
Цитата Сообщение от Bevz Slava Посмотреть сообщение
Если что-то не то кинул, прошу простить)
как-раз то... как я и говорил, у вас отключен 11-й стандарт, гуглите как подключить его для вашего компилятора, ну или пробуйте мой вариант выше
0
Bevz Slava
0 / 0 / 0
Регистрация: 07.11.2016
Сообщений: 15
08.11.2016, 19:35  [ТС] 9
Что-то через чур сложно, реально ли ее как-то упростить?
и выдало ошибки:
||=== Build file: "no target" in "no project" (compiler: unknown) ===|
D:\Code blocks\1\Вторая лаба\zashita.cpp|21|error: 'string' was not declared in this scope|
D:\Code blocks\1\Вторая лаба\zashita.cpp|21|note: suggested alternative:|
C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\4.9.2\include\c++\bits\stringfwd.h|62|note: 'std::string'|
D:\Code blocks\1\Вторая лаба\zashita.cpp|22|error: expected ',' or ';' before '{' token|
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
0
Maxim Prishchepa
Эксперт С++
1926 / 1038 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
08.11.2016, 19:36 10
тфу... ну сделайте #include <string>
0
Bevz Slava
0 / 0 / 0
Регистрация: 07.11.2016
Сообщений: 15
08.11.2016, 19:37  [ТС] 11
Так подключен #include <string>
Но выдает ошибку все-равно...
0
Maxim Prishchepa
Эксперт С++
1926 / 1038 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
08.11.2016, 19:38 12
наврал...
вот вроде рабочий:

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
#include <string>
#include <sstream>
#include <vector>
 
using namespace std; 
 
void split(const std::string &s, char delim, std::vector<std::string> &elems) {
    std::stringstream ss;
    ss.str(s);
    std::string item;
    while (std::getline(ss, item, delim)) {
        elems.push_back(item);
    }
}
 
 
std::vector<std::string> split(const std::string &s, char delim) {
    std::vector<std::string> elems;
    split(s, delim, elems);
    return elems;
}
 
bool isValid(string email)
{
     vector<string> stepOne = split(email, '@');
     if (stepOne.size() != 2)
     {
          return false;
     }
     if (stepOne[0].size() < 1 || stepOne[0].size() >15)
     {
           return false;
     }
     vector<string> stepTwo = split(stepOne[1], '.');
     if (stepTwo.size() != 2)
     {
           return false;
     }
     if (stepTwo[0].size() < 1 || stepTwo[0].size() > 5)
     {
          return false;
     }
 
     if (stepTwo[1].size() < 1 || stepTwo[1].size() > 3)
     {
           return false;
     }
     return true;
}
 
int main()
{
     string email = "test@email.add";
     bool result = isValid(email);
    return 0;
}
0
Bevz Slava
0 / 0 / 0
Регистрация: 07.11.2016
Сообщений: 15
08.11.2016, 19:47  [ТС] 13
Уже запустило, но не хочет ничего работать.
То есть я хочу ввести email- но сразу прекращается.
Вы уж простите если я поднадоел)
0
Миниатюры
Нужно проверить на корректность ввода E-mail адреса  
Croessmah
++Ͻ
15239 / 8630 / 1641
Регистрация: 27.09.2012
Сообщений: 21,251
Записей в блоге: 2
Завершенные тесты: 1
08.11.2016, 19:47 14
MrGluck, оставлю здесь: https://habrahabr.ru/post/280798/
1
MrGluck
Модератор
Эксперт CЭксперт С++
8114 / 4966 / 1436
Регистрация: 29.11.2010
Сообщений: 13,456
08.11.2016, 20:04 15
Цитата Сообщение от Bevz Slava Посмотреть сообщение
MrGluck, в какой среде вы программировали? У меня ошибки выходят.
MinGW в полной мере еще не научился регулярки поддерживать. Тестировал на VS 2015.

Добавлено через 30 секунд
Цитата Сообщение от Croessmah Посмотреть сообщение
MrGluck, оставлю здесь: https://habrahabr.ru/post/280798/
Читал.
Но потренироваться на простых примерах хотелось

Добавлено через 59 секунд
Цитата Сообщение от Bevz Slava Посмотреть сообщение
То есть я хочу ввести email- но сразу прекращается.
Так вы хоть результат выведите.
C++
1
std::cout << std::boolalpha << result << std::endl;
0
Bevz Slava
0 / 0 / 0
Регистрация: 07.11.2016
Сообщений: 15
08.11.2016, 20:52  [ТС] 16
Мда... Я совсем запутался, пойду искать другой метод как можно это сделать, спасибо вам)
0
gazlan
3162 / 1921 / 312
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
08.11.2016, 21:15 17
Есть чудная китайская библиотека RegExp.
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
static CRegexpT<char>      _RE_Mail;
 
   ...
 
   // Compile
   _RE_Mail.Compile("\\b(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])\\b",SINGLELINE);
 
   ...
 
   // Prepare
   CContext*   pContext = _RE_Mail.PrepareMatch((const char*)(LPCTSTR)rText);
 
   // Loop
   MatchResult   Result = _RE_Mail.Match(pContext);
 
   if (!Result.IsMatched())
   {
      // Nothing found
      _RE_Mail.ReleaseContext(pContext);
      return;
   }
 
   ...
 
   while (Result.IsMatched())
   {
      int   iStart = Result.GetStart();
      int   iSize  = Result.GetEnd() - iStart;
 
   ...
 
       // Next
      Result = _RE_Mail.Match(pContext);
   }
 
   // Release
   _RE_Mail.ReleaseContext(pContext);
0
Ferrari F1
793 / 522 / 157
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
08.11.2016, 21:23 18
Bevz Slava, ну вот, решение в лоб
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
#include <iostream>
#include <string>
using namespace std;
 
inline bool IsAllowed(const string& str, const bool& mode)
{
    string charSet
    (
        "qwertyuiopasdfghjklzxcvbnm"
        "QWERTYUIOPASDFGHJKLZXCVBNM"
    );
    mode ? charSet += "1234567890_" : charSet;
 
    return str.find_first_not_of(charSet) == string::npos ?
        false : true;
 
}
 
bool CheckEmail(const string& email)
{
    bool result(false);
 
    size_t pos( email.find('@') );
    if (pos == string::npos || pos != email.rfind('@'))
        return result;
 
    const string substr1(email, 0, pos), substr2(email, pos + 1);
 
    if
    (
        substr1.empty() || substr2.empty() ||
        substr1.size() > 15u || IsAllowed(substr1, true)
    )
        return result;
 
    pos = substr2.find('.');
    if (pos == string::npos || pos != substr2.rfind('.'))
        return result;
 
    const string substr2a(substr2, 0, pos), substr2b(substr2, pos + 1);
 
    if
    (
        substr2a.empty() || substr2b.empty() ||
        substr2a.size() > 5u || substr2b.size() > 3u ||
        IsAllowed(substr2a, false) || IsAllowed(substr2b, false)
    )
        return result;
 
    return result = true;
}
 
int main()
{
    string email = "sdf_@dsd.dd";
    //cin >> email;
 
    cout << boolalpha << CheckEmail(email) << endl;
 
    system("pause");
}
0
08.11.2016, 21:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.11.2016, 21:23

Проверка на корректность введенного e-mail адреса
Доброго времени суток! Написал программу связанную из http-запросов, но не могу написать проверку...

Как на мобильном клиенте проверить корректность введенного адреса эл. почты?
Как на мобильном клиенте проверить корректность введенного адреса эл. почты?

Проверить корректность ввода скобок!
Помогите пожалуйста! Для введенной с клавиатуры строки программа должна определить, корректно ли...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru