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

работа цикла while

08.10.2017, 23:19. Показов 1028. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
здравствуйте
написал вот такой код
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
#include <iostream>
#include <string>
using namespace std;
bool isDelimeter(char c)
{
    const int size = 37;
    char a[size] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z','.',
    '_','1','2','3','4','5','6','7','8','9'}; 
    for (int i = 0; i < size; i++)
    {
        if (a[i] == c)  return false;
    }
    return true;
}
 
int main()
{
    string str = "asdf hsert 2r asr qew@madsadil..ru hsdfg2@cas.com gio24!@#! !@ asdf@mail.net";
    size_t posStart = 0;
    while ((posStart = str.find("@")) != std::string::npos)
    {
    int a=str.find("@");
    //int g = 0;
    int g = 0;
    for (int c = a + 1; c < str.size(); c++)
    {
        if (isDelimeter(str[c]))
        {
            cout << c << endl;
            g=c;
            break;
        }
         
    }
    int b = 0;
    
    for(int i = a-1; i < str.size(); i--)
    {                                                    //////// вырезка емейла
        if(str[i] == ' ')
          {
             b=i;
             break;
             
          }
          
    }
    cout<<b;
    string emeil = "";
    emeil = str.substr(b,g-b);
    cout<<emeil<<endl;
    int f = emeil.find("@");
    int h = emeil.find("."); // вырезка хоста
    string host = emeil.substr(f+1,h-f-1);
    cout<<host<<endl;
    
    if (!host.empty())
    {
        cout<<"not empty"<<endl;
    }
        if (host.empty())       ////// проверка на наличие хоста
    {
        cout<<" empty"<<endl;
    }
    int point = emeil.find(".");
    int point1 = emeil.find(".",point+1);
    //string zone = emeil.substr(point,999);
    //cout<<zone;
    if (point1 == -1)
    {
        cout<<"ok is point";
    }
    if (point1 != -1)              ////////// проверка повторных точек
    {
        cout<<"wrong address";
    }
}
}
он проверяет корректность емейла
через цикл while вот тут
C++
1
2
    size_t posStart = 0;
    while ((posStart = str.find("@")) != std::string::npos)
пытаюсь пройти по всем возможным емейлам и проверить их корректность
на выходе получаю сейчас
бесконечный цикл с выводом ew@madsadil..ru и его проверкой
а должен получить
qew@madsadil..ru
hsdfg2@cas.com gio24!@
!@
asdf@mail.net
с разными результатами проверки.
я так понимаю проблема в цикле while не могли бы подсказать в чем дело?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.10.2017, 23:19
Ответы с готовыми решениями:

Неправильная работа цикла
Есть два цикла: while (infile){ infile &gt;&gt; dist1; cout &lt;&lt; dist1 &lt;&lt; endl; } while (1){...

Некорректная работа цикла for.
Ниже приведен код программы, вычисляющей по заданному n значение n!. Прошу объяснить, почему...

работа цикла for c права налево
подскажите что то не пойму как мне сделать цикл от указаного элемента до первого пробела и вывести...

Работа со строками с применением цикла
Не могу справиться с заданием уже не малое количество времени. Хромает реализация формирования...

9
Usaga
09.10.2017, 07:32
  #2

Не по теме:

Цитата Сообщение от alex14058 Посмотреть сообщение
я так понимаю проблема в цикле while не могли бы подсказать в чем дело?
У тебя есть отличный подсказыватель - отладчик (Debugger). Попробуй его спросить.

0
Модератор
Эксперт С++
13498 / 10752 / 6407
Регистрация: 18.12.2011
Сообщений: 28,692
09.10.2017, 08:17 3
Лучший ответ Сообщение было отмечено alex14058 как решение

Решение

Вы каждый раз ищете знак @ с начала строки, а не с позиции, где кончается очередной email
0
0 / 0 / 2
Регистрация: 24.05.2017
Сообщений: 87
14.10.2017, 20:07  [ТС] 4
переделал
вот так
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
#include <iostream>
#include <string>
using namespace std;
bool isDelimeter(char c)
{
    const int size = 37;
    char a[size] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z','.',
    '_','1','2','3','4','5','6','7','8','9'}; 
    for (int i = 0; i < size; i++)
    {
        if (a[i] == c)  return false;
    }
    return true;
}
 
int main()
{
    string str = "asdf hsert 2r asr qew@madsadil.ru hsdfg2@cas.com gio24!@#! !@ asdf@mail.net";
    int posStart = 0;
    while ((posStart = str.find("@",posStart+1)) != std::string::npos)
        {
        int a=str.find("@");
        //int g = 0;
        int g = 0;
        for (int c = a + 1; c < str.size(); c++)
        {
            if (isDelimeter(str[c]))
            {
                //cout << c << endl;
                g=c;
                break;
            }
             
        }
        int b = 0;
        
        for(int i = a-1; i < str.size(); i--)
        {                                                    //////// вырезка емейла
            if(str[i] == ' ')
              {
                 b=i;
                 break;
                 
              }
              
        }
       // cout<<b;
        string emeil = "";
        emeil = str.substr(b,g-b);
        cout<<emeil<<endl;
        int f = emeil.find("@");
        int h = emeil.find("."); // вырезка хоста
        string host = emeil.substr(f+1,h-f-1);
       // cout<<host<<endl;
        
        if (!host.empty())
        {
            cout<<"not empty"<<endl;
        }
            if (host.empty())       ////// проверка на наличие хоста
        {
            cout<<" empty"<<endl;
        }
        int point = emeil.find(".");
        int point1 = emeil.find(".",point+1);
        //string zone = emeil.substr(point,999);
        //cout<<zone;
        if (point1 == -1)
        {
            cout<<"ok is point";
        }
        if (point1 != -1)              ////////// проверка повторных точек
        {
            cout<<"wrong address";
        }
    }
}
вот тут изменения которые как я думал помогут
C++
1
2
    int posStart = 0;
    while ((posStart = str.find("@",posStart+1)) != std::string::npos)
вывод сейчас вот такой
qew@madsadil.ru
not empty
ok is point qew@madsadil.ru
not empty
ok is point qew@madsadil.ru
not empty
ok is point qew@madsadil.ru
not empty
ok is point qew@madsadil.ru
not empty
ok is point
Exit code: 0 (normal program termination)
0
Модератор
Эксперт С++
13498 / 10752 / 6407
Регистрация: 18.12.2011
Сообщений: 28,692
14.10.2017, 20:55 5
Цитата Сообщение от alex14058 Посмотреть сообщение
int a=str.find("@");
А тут почему поиск с начала строки?
0
0 / 0 / 2
Регистрация: 24.05.2017
Сообщений: 87
15.10.2017, 00:10  [ТС] 6
Цитата Сообщение от zss Посмотреть сообщение
А тут почему поиск с начала строки?
C++
1
2
3
int a=str.find("@");
        //int g = 0;
        int g = 0;
тут уже идет поиск @ не посредственно в емейли в данном случае qew@madsadil.ru (во всяком случае по задумки. но видимо я ошибаюсь где то)
если я a заменю на posStart вывод программы не измениться
0
1352 / 851 / 365
Регистрация: 26.02.2015
Сообщений: 3,799
15.10.2017, 00:19 7
Вы написали функцию isDelimetr, но почему бы не воспользоваться готовыми средствами? isalpha, isdigit?
0
0 / 0 / 2
Регистрация: 24.05.2017
Сообщений: 87
15.10.2017, 00:28  [ТС] 8
Цитата Сообщение от Nishen Посмотреть сообщение
Вы написали функцию isDelimetr, но почему бы не воспользоваться готовыми средствами? isalpha, isdigit?
по условиям задачи это требовалось, и второй момент не хотелось пользоваться чем то уже готовым. и если честно пока не знаю как работает isalpha, isdigit. и не хочется просто бездумно использовать не понимая как это работает
разве из за функции isDelimetr вывод не тот что нужно? просто код коряво написан и с ошибками,и я не пойму где в данный момент ошибка
0
1352 / 851 / 365
Регистрация: 26.02.2015
Сообщений: 3,799
15.10.2017, 01:15 9
Лучший ответ Сообщение было отмечено alex14058 как решение

Решение

Цитата Сообщение от alex14058 Посмотреть сообщение
не хотелось пользоваться чем то уже готовым
Страуструп пишет, что черта профессионала - умения повторного использования уже наработанного материала. Не дословно, но смысл тот.
0
0 / 0 / 2
Регистрация: 24.05.2017
Сообщений: 87
15.10.2017, 02:30  [ТС] 10
Цитата Сообщение от Nishen Посмотреть сообщение
Страуструп пишет, что черта профессионала - умения повторного использования уже наработанного материала. Не дословно, но смысл тот.
согласен с вами
но мне бы с моим кодом разобраться)))
0
15.10.2017, 02:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2017, 02:30
Помогаю со студенческими работами здесь

Условие цикла if, неправильная работа if
cin.getline(str1,N); //getline-запись данных в строку str1,размерность N; cout&lt;&lt;&quot;Enter...

Работа с OpenMP. Распараллеливание цикла for
Доброго времени суток товарищи. При работе с OpenMP возник следующий вопрос Почему код int i;...

Работа цикла типа while. Найти ошибку в коде
Добрый день. Ребята, помогите, пожалуйста. Не могу понять, что не так. В итоге результат выходит:...

Не коректная работа getline() во время повторений цикла
Доброго времени суток, написал программу которая кирилицу(а конкретно украинские буквы) превращает...


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

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

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