4

我正在编写一个函数来返回一个数字的反转,即它转换int(1234)int(4321). 这是我目前拥有的:

#include <iostream>
#include <cstdlib>
#include <string>
#include <sstream>

using namespace std;


int reverse(int num) {
  stringstream ss (stringstream::in | stringstream::out);
  string initial; 
  int reversed;

  // read the number in to a string stream
  ss << num;
  initial = ss.str();

  // flush the stringstream
  ss.str("");
  for(unsigned int i(0); i <= initial.size(); i++) {
    ss << initial[initial.size() - i];
  }
  ss >> reversed;

  return reversed;
}


int main(int argc, const char *argv[])
{
  int test = 9871;
  cout << "test = " << test << endl;
  cout << "reverse = " << reverse(test) << endl;

  return 0;
}

然而,这只是输出:

test = 9871
reverse = 0

而且我很确定问题出在该行ss >> reversed中,问题在于它reversed被设置为0而不是值ss,但我无法弄清楚这段代码有什么问题,而且它看起来应该是令人愤怒的简单的。任何人都可以帮忙吗?

谢谢

4

5 回答 5

5

i从 0 开始,然后initial.size() - i超出字符串范围。

更改为并从 1ss << initial[initial.size() - i - 1];迭代到iinitiali.size() - 1

for(unsigned i = 0; i != initial.size(); ++i) {
  ss << initial[initial.size() - i -1];
}

或者从 1 迭代i到 initial.size()

for(unsigned i = 1; i <= initial.size(); ++i) {
  ss << initial[initial.size() - i];
}
于 2012-05-30T15:17:43.780 回答
2

执行您想要的最快的 C++11 方法是:

string s = std::to_string(my_int);
std::reverse(begin(s), end(s));
return std::stoi(s);
于 2012-05-30T15:21:46.290 回答
2

for循环导致对 的越界访问initial。除了Alessandro Pezzato指出的问题外,循环中的终止条件for需要更改为,i < initial.size()否则仍然会发生越界:

for(unsigned int i(0); i < initial.size(); i++) {
    ss << initial[initial.size() - i - 1];
}
于 2012-05-30T15:21:15.570 回答
2

您的问题源于您索引数组的方式,您总是需要在脑后知道 C/C++ 和许多类似语言中的索引数组是从零开始的,因为它允许一些计数问题在以下情况下消失。从一开始。

如果您的字符串的大小是 16 个字符,这意味着该特定字符串的索引在 16-1=15 处最大,给出范围 [0,15]。一般来说,它是size() - 1. 如果initial[initial.size() - 1 - i]对您来说看起来很脏,您可以随时将其设置为临时变量,例如maxIndex.

int maxIndex = initial.size() - 1;
for(unsigned int i = 0; i <= maxIndex; i++) 
{
    ss << initial[maxIndex - i]; 
}
于 2012-05-30T15:33:46.610 回答
0

在我看来,字符串转换使这更加复杂。我想我会直接从intto转换int

int reverse(int input) {
    static const int base = 10;
    int ret = 0;

    while (input) { 
        ret = ret * base + input % base;
        input /= base;
    }
    return ret;
}

请注意,您必须(稍微)更加精细才能正确处理负数。我用作int输入和输出类型是因为原始类型确实如此 - 但与原始类型一样,这只会真正为非负输入产生合理的结果。

于 2012-05-30T15:39:51.750 回答