Отмена строки из первых принципов - что не так? - PullRequest
0 голосов
/ 19 марта 2019

Я учусь обращать строки (т. Е. Писать в обратном направлении) из первых принципов C ++. Я разработал следующий код, который предназначен для получения строки от пользователя, ее обращения и распечатки. Тем не менее, он не может скомпилировать - Visual Studio выдает ошибку «Подмножество строк вне диапазона». Что не так?

using namespace std;

int main()
{
    string example;

    getline(cin, example);

    int i = 0;

    while (example[i] != '\0') 
    {
        i++;
    }

    int n=0;
    string reverse;

    while (n < i)
    {
        reverse[n] = example[i - n - 1];
        n++;
    }

    cout << reverse << endl;

    return 0;
}

Я использую C ++ 17.

Ответы [ 2 ]

2 голосов
/ 19 марта 2019

reverse[n] вызывает проблему строки вне индекса.Вы только что создали строку и ее размер равен нулю.Вот как это исправить:

#include <string>
#include <iostream>

using std::string;
using std::cin;
using std::cout;
using std::endl;
using std::getline;

int main()
{
    string example;
    getline(cin, example);
    int i = 0;
    while (example[i] != '\0') 
    {
        i++;
    }

    int n=0;
    string reverse(example.size(), 0);

    while (n < i)
    {
        reverse[n] = example[i - n - 1];
        n++;
    }

    cout << reverse << endl;

    return 0;
}

Однако в этом коде все еще много неправильного.Например, хранить размер строки в int - плохая идея.Используйте std::string::size_type вместо этого.И std::string::size уже дает вам размер, не нужно его считать.Также рассмотрите возможность использования цикла for здесь:

#include <string>
#include <iostream>

using std::string;
using std::cin;
using std::cout;
using std::endl;
using std::getline;

int main()
{
    string example;
    getline(cin, example);
    string reverse(example.size(), 0);
    for (string::size_type n = 0; n != example.size(); ++n)
    {
        reverse[n] = example[example.size() - n - 1];
    }

    cout << reverse << endl;

    return 0;
}

Сказав это, вот как я бы это реализовал:

#include <string>
#include <iostream>

using std::string;
using std::cin;
using std::cout;
using std::endl;
using std::getline;

int main()
{
  auto example = string();
  getline(cin, example);
  auto reverse = string(example.crbegin(), example.crend());

  cout << reverse << endl;

  return 0;
}

Обязательно ознакомьтесь с обратными итераторами если вы еще не.

0 голосов
/ 19 марта 2019

Ваша проблема: reverse[n] = example[i - n - 1];

Поскольку вы использовали строку в качестве типа данных, но используете синтаксис массива символов;

измените ее на:

`reverse += example[i - n - 1];

Полный код для справки: `

#include <iostream>

using namespace std;

int main()
{

    string example;

    getline(cin, example);

    int i = 0;

    while (example[i] != '\0') 
    {
        i++;
    }

    int n=0;
    string reverse;

    //cout << i << endl;

    while (n < i)
    {
        reverse += example[i - n - 1];
        n++;
    }

    cout << reverse << endl;

    return 0;
}
...