从第一原理反转字符串 - 有什么问题?

Reversing a string from first principles - what's wrong?

本文关键字:什么 问题 字符串      更新时间:2023-10-16

我正在学习如何从C 中的第一原理逆转字符串(即向后写)。我设计了以下代码,该代码旨在从用户中摘取字符串,将其倒转并将其打印出来。但是,它无法编译 - Visual Studio给我一个错误的"字符串子集超出范围"。怎么了?

using namespace std;
int main()
{
    string example;
    getline(cin, example);
    int i = 0;
    while (example[i] != '') 
    {
        i++;
    }
    int n=0;
    string reverse;
    while (n < i)
    {
        reverse[n] = example[i - n - 1];
        n++;
    }
    cout << reverse << endl;
    return 0;
}

我是针对C 17。

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] != '') 
    {
        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_typestd::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[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] != '') 
    {
        i++;
    }
    int n=0;
    string reverse;
    //cout << i << endl;
    while (n < i)
    {
        reverse += example[i - n - 1];
        n++;
    }
    cout << reverse << endl;
    return 0;
}