颠倒基本原则的字符串-怎么了?

时间:2019-03-19 16:45:30

标签: c++ string reverse

我正在学习如何从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 个答案:

答案 0 :(得分:2)

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

如果还没有熟悉reverse iterators,请确保自己熟悉。

答案 1 :(得分:0)

您的问题: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;
}