Как использовать функцию string.substr ()? - PullRequest
35 голосов
/ 19 марта 2010

Я хочу создать программу, которая будет считывать некоторое число в строковом формате и выводить его следующим образом: если число равно 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;
}

Ответы [ 7 ]

65 голосов
/ 19 марта 2010

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

b = a.substr(i,2);

?

21 голосов
/ 19 марта 2010

Как показано здесь , вторым аргументом 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 <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;
}
3 голосов
/ 19 марта 2010

Еще один интересный вариант вопроса может быть:

Как бы вы сделали "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 << " ";
    }
2 голосов
/ 14 июня 2014

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

2 голосов
/ 31 марта 2013

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

#include<iostream>
#include<string>

using namespace std;


int main() {
    string c="12345";
    int p=0;

    for(int i=0;i<c.length();i++) {
        cout<<c[i];
        p++;

        if (p % 2 == 0 && i != c.length()-1) {
            cout<<" "<<c[i];
            p++;
        }
    }
}
2 голосов
/ 18 сентября 2012

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

#include<stdio.h>
#include<conio.h>
#include<string.h>
int main()
{
  char *str;
  clrscr();
  printf("\n Enter the string");
  gets(str);
  for(int i=0;i<strlen(str)-1;i++)
  {
    for(int j=i;j<=i+1;j++)
      printf("%c",str[j]);
    printf("\t");
  }
  getch();
  return 0;
}
0 голосов
/ 25 февраля 2019

Возможное решение с string_view

void do_it_with_string_view( void )
{
    std::string a { "12345" };
    for ( std::string_view v { a }; v.size() - 1; v.remove_prefix( 1 ) )
        std::cout << v.substr( 0, 2 ) << " ";
    std::cout << std::endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...