4

私はC++(C#のバックグラウンドから来ています)に不慣れで、文字列をintに変換する方法を学ぼうとしています。

次のように、を使用してstringstreamをに出力することで機能しましたdouble

const char* inputIndex = "5+2";
double number = 0;
stringstream ss(inputIndex);
ss >> number;
// number = 5

これはうまくいきます。私が抱えている問題は、解析している文字列が数字で始まるが、数字の後に数字ではなく他の文字が含まれている可能性があることです(たとえば、「5 + 2」、「9-(3 + 2)」など)。 。はstringstream、最初に数字を解析し、必要に応じて、数字以外の数字に遭遇すると停止します。

問題は、数値を解析するために使用された文字数を知りたいときに発生します。たとえば、を解析する場合、文字列ポインタを進めることができるように、25+2解析に2文字が使用されたことを知りたいと思います。25

これまでのところ、をクリアしstringstream、解析された数値を入力し直して、結果の文字列の長さを読み取ることで、機能するようになりました。

ss.str("");
ss << number;

inputIndex += ss.str().length();

str()これは機能しますが、私には本当にハッキーなようです(ただし、C#のようなものから来ているためかもしれません) 。また、が文字列のコピーを作成するため、メモリリークが発生する可能性があると感じています。

これを行う他の方法はありますか、それとも私が持っているものに固執する必要がありますか?

ありがとう。

4

2 に答える 2

6

を使用std::stringstream::tellg()して、入力ストリーム内の現在の取得位置を見つけることができます。ストリームから抽出する前に、この値を変数に格納します。次に、ストリームから抽出した後、位置を再度取得します。これら2つの値の違いは、抽出される文字数です。

double x = 3435;
std::stringstream ss;
ss << x;

double y;
std::streampos pos = ss.tellg();
ss >> y;
std::cout << (ss.tellg() - pos) << " characters extracted" << std::endl;
于 2011-01-25T02:29:47.613 に答える
1

上記のtellg()を使用した解決策は、最新のコンパイラー(gcc-4.6など)では失敗します。

この理由は、tellg()が実際にカーソルの位置を示しているためですが、これは現在スコープ外です。たとえば、「ファイルストリームtellg / tellpおよびgcc-4.6はバグですか?」を参照してください。

したがって、eof()もテストする必要があります(入力全体が消費されたことを意味します)。

于 2013-04-16T16:04:38.040 に答える