web-dev-qa-db-ja.com

atoiと同等

C++でatoiを置き換えることができる関数はありますか?私はいくつかの調査を行ったが、それを置き換えるものが見つからなかった、唯一の解決策はcstdlibを使用するか自分で実装することである

26
Mansuro

Boostを使用したくない場合は、C++ 11に std::stoi 文字列用。同様のメソッドがすべてのタイプに存在します。

std::string s = "123"
int num = std::stoi(s);

atoiとは異なり、変換できない場合は invalid_argument 例外がスローされます。また、値がintの範囲外の場合、 out_of_range 例外がスローされます。

17
David Rinck

boost::lexical_cast はあなたの友達です

#include <string>
#include <boost/lexical_cast.hpp>

int main()
{
    std::string s = "123";
    try
    {
       int i = boost::lexical_cast<int>(s); //i == 123
    }
    catch(const boost::bad_lexical_cast&)
    {
        //incorrect format   
    }
}
9
Armen Tsirunyan

次のように、Boost関数boost :: lexical_cast <>を使用できます。

char* numericString = "911";
int num = boost::lexical_cast<int>( numericString );

詳細については、こちらをご覧ください こちら (最新のBoostバージョン1.47)。例外を適切に処理することを忘れないでください。

4

ブーストなし:
stringstream ss(my_string_with_a_number); int my_res; ss >> my_res;
ブーストバージョンと同じくらい厄介ですが、追加の依存関係はありません。おそらくより多くのRAMを浪費する可能性があります。

3
Torp

atoiが不適切である理由をあなたは言わないので、パフォーマンスに何らかの影響があると思います。とにかく、説明が役に立ちます。

Boost Spirit.Qiの使用は、少なくとも Alex Ottによるテスト では、atoiよりも1桁高速です。

参照はありませんが、前回テストしたときはBoost lexical_castatoiよりも約1桁遅い。その理由は、非常に高価な文字列ストリームを構築するためだと思います。

更新いくつかのより最近のテスト

2
Alastair

関数 stoi(); を使用できます

#include <string> 
// Need to include the <string> library to use stoi

int mani(){

   std::string s = "10";
   int n = stoi(s);

}

これを実際にコンパイルするには、c ++ 11を有効にする必要があります。それを行う方法をGoogleで検索してください(コード::ブロックの場合:設定->コンパイラ->「g ++にC++ 11 ISO C++言語標準に従ってください」)端末からコンパイルする場合は、-std = c ++ 11を追加する必要があります

g++ -std=c++11 -o program program.cpp
0
Mirco De Zorzi