从第一原则扭转字符串 - 出了什么问题?

问题描述 投票:0回答:2

我正在学习如何从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。

c++ string reverse
2个回答
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


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;
}
© www.soinside.com 2019 - 2024. All rights reserved.