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

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

#include  #include  #include  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; } 

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

 b = a.substr(i,2); 

?

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

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

Создать подстроку

Возвращает строковый объект с его содержимым, инициализированным подстрокой текущего объекта. Эта подстрока представляет собой последовательность символов, которая начинается с позиции символа 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  #include  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; } 

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

Как вы могли бы сделать "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 << " "; } 

Вы можете получить вышеупомянутый вывод, используя следующий код в c

 #include #include #include int main() { char *str; clrscr(); printf("\n Enter the string"); gets(str); for(int i=0;i 

Возможное решение без использования substr()

 #include #include using namespace std; int main() { string c="12345"; int p=0; for(int i=0;i 

substr(i,j) означает, что вы начинаете с индекса i (считая первый индекс равным 0) и принимаете следующие j символы. Это не значит подходить к индексу j .

  • Java - удаление первого символа строки
  • Interesting Posts

    Как профилировать сценарий оболочки bash медленный запуск?

    removeCallbacks не останавливается

    Какой порядок вложенных циклов для итерации по 2D-массиву более эффективен

    Подмножество матрицы в соответствии с вектором столбцов

    Поиск области Ninject, которая ведет себя как InRequestScope

    Ubuntu + последняя версия samba, символические ссылки больше не работают на share, установленном в окнах

    Что делает akamaihd.net?

    Как получить полное дерево каталогов с помощью SPL?

    Возможное непреднамеренное сравнение ссылок

    Как игнорировать некоторые элементы при сравнении XML?

    Могу ли я использовать Google Apps Sync для Outlook исключительно как инструмент синхронизации, а не для миграции электронной почты?

    Ошибка получения родительского элемента для элемента: ресурс не найден, который соответствует указанному имени после обновления до AppCompat v23

    Facebook API SDK отменяет доступ

    Predict () – Может быть, я не понимаю

    Восстановить структуру таблицы из файлов frm и ibd

    Давайте будем гением компьютера.