2

を使用して数値std::string整数に変換しようとしていますstd::istringstream

std::istringstream convertor;

convertor.str(mystring);
convertor >> myint;

数値文字列が整数の制限を超えている (または超えている) 場合に例外をスローしたいのですが、どうすればよいかわかりません。std::istringstream に固有のものか、この目的のために特別に作成された何かがあるのだろうか、それとも汚い (少なくとも汚いようです:)) 方法を使用する必要がありますnumeric_limitsか?

ご協力ありがとうございました。

4

3 に答える 3

1

C ++ 11機能にアクセスできる場合は、試してみてくださいstd::stoi(my_string);

そうではないが、Boostライブラリにアクセスできる場合は、次のことを試してください。

std::string str("112211"); 
int x = 0;
try
{
    x = boost::lexical_cast<int>(str);
}
(catch boost::bad_lexical_cast&)
{
}

boost :: lexicalキャストは、内部で使用するために定義されています(少なくとも一般的な場合)istringstream(をオーバーライドstd::istream& operator>>するyour_typeと、)でタイプを読み取ることができますlexical_cast<your_type>(string)

ブーストするためのアクセス権がない場合は、自分でロールしてください(このスレッドの他の人は、例外をスローするようにiostreamを設定する方法をすでに指摘しています)。

編集:あなた自身を転がす:

template<typename T>
T lexical_cast<T>(const std::string & str)
{
    std::istringstream buffer(str);
    buffer.exceptions(std::istringstream::failbit);
    T retval;
    buffer >> retval;
    return retval;
}

これは、iostreamioをサポートしない値タイプに特化できます。

于 2013-02-19T15:38:20.223 に答える
1
std::istringstream convertor;
convertor.str(mystring);
if(!(convertor >> myint)) {
    thow std::invalid_argument();
}

このような関数は、標準ライブラリで既に利用可能であることに注意してください。(C++11)

it=std::stoi(my_string);

http://en.cppreference.com/w/cpp/string/basic_string/stol

さらに、関数の前提条件は整数値を表す必要があるため、これは間違いなく例外の乱用でmystringあり、それが前提条件でない場合は、そうでない場合を処理する関数の通常のフロー制御の一部です。

私はおそらく次のように書くでしょう:

std::pair<bool, int> try_to_int(const std::string& str);

または、boost::optional もここでうまく機能します

于 2013-02-19T15:27:35.763 に答える
0

回答ありがとうございます。質問のコメントで解決策を見つけました。

std::istringstream convertor;

convertor.str("16");
convertor >> myint;
if (convertor.fail())
    std::cerr << "error" << std::endl;

または、例外をスローするには:

std::istringstream convertor;

convertor.exceptions(std::istringstream::failbit);
convertor.str("16");
convertor >> myint;
于 2013-02-19T18:00:16.797 に答える