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という問題であると確信していますが、このコードの何が問題になっているのか理解できず、本来あるべきように思われるので腹立たしいです単純。誰か助けてもらえますか?reversed0ss

ありがとう

4

5 に答える 5

5

i0から始まり、initial.size() - i文字列の範囲外です。

1からに変更しss << initial[initial.size() - i - 1];て繰り返しますiinitiali.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];
}
于 2012-05-30T15:17:43.780 に答える
2

forループの結果、へのアクセスが範囲外になりますinitialAlessandro 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++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

あなたの問題はあなたがあなたの配列にインデックスを付ける方法に起因します、あなたは常に頭の後ろでC /C++と多くの同様の言語でのインデックスがゼロベースであることを知る必要があります1つから始めます。

文字列のサイズが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

文字列変換はこれをより複雑にするように私には思えます。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は入力および出力タイプとして使用しました-しかし、オリジナルのように、これは非負の入力に対して実際に賢明な結果を生成するだけです。

于 2012-05-30T15:39:51.750 に答える