Форум программистов, компьютерный форум CyberForum.ru

string iterator - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
03.03.2013, 18:40     string iterator #1
Почему выдает ошибку при перемещение итератора на другую позицию?
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
#include <iostream>
#include <string>
 
using namespace std;
 
int main ()
{
    string s = "1234A77FF3";
    string tmp = "";
    string::iterator it = s.begin();
    while(it != s.end())
    {
        if(*it>48 && *it<57)
            while((*it>48 && *it<57) || it != s.end()){
                tmp += *it;
                //it++; здесь ошибка, почему?
            }
            tmp+=" ";
        ++it;
    }
    cout<<tmp;
    system("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.03.2013, 18:40     string iterator
Посмотрите здесь:

C++ STL List Iterator
std::sort(iterator, iterator, method) подскажите как исправить C++
C++ STL vector iterator
iterator to count C++
C++ deque iterator not dereferencable
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
03.03.2013, 18:51     string iterator #2
мне кажется если вы уберёте комент, то можете просто проскачить while(it != s.end()) прибавив к it сразу две итерации
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
03.03.2013, 19:18  [ТС]     string iterator #3
Вы были правы. Так программа работает, но когда последний символ стоит цифра то программа падает. Как это исправить?
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
#include <iostream>
#include <string>
 
using namespace std;
 
int main ()
{
    string s = "1234A77FF3j";
    string tmp = "";
    string::iterator it = s.begin();
    bool for_it = true;
    do
    {
        if(*it>48 && *it<57)
            while((*it>48 && *it<57)){
                tmp += *it;
                it++;
            }
            tmp+=" ";
        ++it;
    }while(it != s.end());
    cout<<tmp;
    system("pause");
    return 0;
}
Добавлено через 14 минут
С этим разобрался, но возникла другая проблема: почему строка tmp_for_symbol всегда пуста?
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>
 
using namespace std;
 
int main ()
{
    string s = "1234A77B3";
    string tmp_for_digit = "";
    string tmp_for_symbol = "";
    string::iterator it = s.begin();
    bool for_it = true;
    do
    {
        if(*it>48 && *it<57)
            while((*it>48 && *it<57)){
                tmp_for_digit += *it;
                it++;
                if(it == s.end()){
                    for_it = false;
                    break;
                }
            }
        else{
            while(*it == 'A' || *it == 'B'){
                tmp_for_symbol += *it;
                it++;
                if(it == s.end()){
                    for_it = false;
                    break;
                }
            }
        }
        tmp_for_symbol += " ";
        tmp_for_digit+=" ";
        if(for_it == true)
            ++it;
    }while(it != s.end());
    cout<<tmp_for_digit<<endl<<tmp_for_symbol;
    system("pause");
    return 0;
}
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
03.03.2013, 21:32     string iterator #4
что вы хотите сделать, какой результат должна получать программа? у вас сохранилась эта опасная концепция, когда вы в цикле изменяете итератор в разных местах во вложенных циклах.

Добавлено через 20 минут
по хорошему цифры или буквы в строке нужно искать регулярными выражениями
может вы хотите сделать это
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
    int digit = true;
    string s = "1234A77B3";
    string tmp_for_digit = "";
    string tmp_for_symbol = "";
    string::iterator it = s.begin();
    while(it != s.end())
    {
        if(*it>48 && *it<57)
        {
            if (!digit) tmp_for_digit +=" ";
            tmp_for_digit += *it;
            digit = true;
        }
        if(*it == 'A' || *it == 'B')
        {
            if (digit) tmp_for_symbol += " ";
            tmp_for_symbol += *it;
            digit = false;
        }
        ++it;
    }
    cout<<tmp_for_digit<<endl<<tmp_for_symbol;
    return 0;
}
вывод
1234 77 3
A B
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
03.03.2013, 21:36  [ТС]     string iterator #5
XRuZzz, Да, это то что я хотел!
Yandex
Объявления
03.03.2013, 21:36     string iterator
Ответ Создать тему
Опции темы

Текущее время: 23:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru