C ++ stringstream>> int返回零

时间:2012-05-30 15:13:23

标签: c++ integer stringstream

我正在编写一个函数来返回数字的反转,即它将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的值,但是我无法弄清楚这段代码有什么问题,而且这很令人气愤,因为它看起来应该很简单。有人可以帮忙吗?

由于

5 个答案:

答案 0 :(得分:5)

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

更改为ss << initial[initial.size() - i - 1];并将i从1重复到initiali.size() - 1

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

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

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

答案 1 :(得分:2)

for循环导致initial的界限访问超出范围。除Alessandro Pezzato指出的问题外,for循环中的终止条件需要更改为i < initial.size(),否则仍会出现超出界限:

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

答案 2 :(得分:2)

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

string s = std::to_string(my_int);
std::reverse(begin(s), end(s));
return std::stoi(s);

答案 3 :(得分: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]; 
}

答案 4 :(得分:0)

在我看来,字符串转换使这更复杂。我想我会从int直接转换为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作为输入和输出类型,因为原始的 - 但与原始一样,这只能为非负输入产生合理的结果。