Получение подстроки из std :: string с помощью итераторов - PullRequest
0 голосов
/ 17 марта 2019

Я хочу получить подстроку от первого появления char в строке до конца строки.Я думал, что могу просто использовать конструктор, как в этом вопросе , но на самом деле это не работает.Когда я делаю так:

string(input.find(' ')+1, input.end()-1)

Я сталкиваюсь с ошибкой "нет конструктора"

error: no matching constructor for initialization of 'std::__cxx11::string' (aka 'basic_string<char>')

Как я могу исправить эту проблему и заставить мой код работать?

Ответы [ 3 ]

4 голосов
/ 17 марта 2019

Я предполагаю, что input является std::string

Если вы посмотрите документацию std::string::find, вы обнаружите, что она возвращает индекс найденного символа; не итератор. Чтобы использовать конструктор итератора, вы должны использовать:

auto str = std::string(input.begin() + input.find(' '), input.end());

Кроме того, вы можете использовать substr член input:

auto str = input.substr(input.find(' '));

+1 и -1 в вашем примере сбивают с толку. Если вы добавите 1 к первому, то вы получите подстроку, начинающуюся после найденного символа, а не начиная с символа. Если вы вычли 1 из конца, вы копируете до одного перед последним символом, а не до конца строки.


Обратите внимание, что вам, вероятно, также необходимо обработать случай, когда символ не найден. Конструкторский подход (как я реализовал) будет иметь неопределенное поведение. Подход substr вызовет исключение.

1 голос
/ 18 марта 2019

Ради защитного программирования вы можете рассмотреть патологический случай, когда в input.

нет пробела. Вот два решения: одно с использованием итераторов и стандартных алгоритмов, другое с использованием* * * * * * * * * * * * * * * * * * * * *

* * * * * *

1012 http://coliru.stacked *1015* *1015* *1015* *1015* *1015* *1015* *1015* *1015* * 1014Примечание: это только примеры.Есть много способов снять кожу с этой кошки.

1 голос
/ 17 марта 2019

Функция-член find в std::string не возвращает итератор.

Существует также std::string::substr, который можно использовать как input.substr(input.find(' ') + 1);

...