Как использовать string.substr () функция?

Я хочу сделать программу, которая считает некоторое число в формате строки и произведет его как это: если число 12345, оно должно затем произвести 12 23 34 45. Я пытался использовать substr () функция из строковой библиотеки C++, но это дает мне странные результаты - это производит 1 23 345 45 вместо ожидаемого результата. Почему?

#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
int main(void)
{
    string a;
    cin >> a;
    string b;
    int c;

    for(int i=0;i<a.size()-1;++i)
    {
        b = a.substr(i,i+1);
        c = atoi(b.c_str());
        cout << c << " ";
    }
    cout << endl;
    return 0;
}
39
задан IAbstract 16 January 2017 в 16:59
поделиться

3 ответа

Если я прав, второй параметр substr () должен быть длиной подстроки. Как насчет

b = a.substr(i,2);

?

67
ответ дан 27 November 2019 в 02:16
поделиться

Другой интересный вариантный вопрос может быть следующим:

Как бы вы сделали «12345» как «12 23 34 45 " без использования другой строки?

Подойдет ли следующее?

    for(int i=0; i < a.size()-1; ++i)
    {
        //b = a.substr(i, 2);
        c = atoi((a.substr(i, 2)).c_str());
        cout << c << " ";
    }
3
ответ дан 27 November 2019 в 02:16
поделиться

Как показано здесь , вторым аргументом substr является длина , а не конечная позиция:

string substr (size_t pos = 0, size_t n = npos) const;

Generate substring

Возвращает строковый объект с его содержимым, инициализированным как подстрока текущего объект. Эта подстрока представляет собой последовательность символов, которая начинается с позиции символа pos и имеет длину n символов.

Ваша строка b = a.substr (i, i + 1); будет сгенерирована для значений i :

substr(0,1) = 1
substr(1,2) = 23
substr(2,3) = 345
substr(3,4) = 45  (since your string stops there).

Вам понадобится b = a.substr (i, 2);

Вы также должны знать, что ваш результат будет выглядеть забавно для числа вроде 12045. Вы получите 12 20 4 45 из-за того, что вы ' повторно используем atoi () в строковой секции и выводим это целое число. Вы можете попробовать просто вывести саму строку, которая будет длиной из двух символов:

b = a.substr(i,2);
cout << b << " ";

На самом деле, все это можно было бы проще записать как:

#include <iostream>
#include <string>
using namespace std;
int main(void) {
    string a;
    cin >> a;
    for (int i = 0; i < a.size() - 1; i++)
        cout << a.substr(i,2) << " ";
    cout << endl;
    return 0;
}
22
ответ дан 27 November 2019 в 02:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: