web-dev-qa-db-ja.com

「atoi()」を使用した整数へのバイナリ文字列

バイナリの文字列があり、それをatoi()を使用して整数に変換します。これを行うと、バイナリが自動的に10進数に変換されるようです。問題は、結果の整数が負であり、オンラインの2進数から10進数へのコンバーターのいずれとも一致しないことです。 atoi()で何か問題がありますか?代わりに別の関数を使用する必要がありますか?

コード:

string myString = "01000101";
int x = atoi(myString.c_str());
cout << x;

ありがとう

14
SkippyNBS

atoiは2進数を処理せず、大きな10進数として解釈するだけです。あなたの問題は、それが高すぎて、10進数として解釈されるために整数オーバーフローが発生することです。

解決策は、C++ 11でstoiに追加されたstolstollまたはstringを使用することです。のようにそれらを呼び出します

int i = std::stoi("01000101", nullptr, 2);
  • 戻り値は、変換されたint値です。
  • 最初の引数は、変換するstd::stringです。
  • 2番目はsize_t *で、最初の数字以外の文字のインデックスを保存します。
  • 3番目は、変換に使用される基数に対応するintです。

関数の詳細については、 そのcppreferenceページ を参照してください。


ほぼ同じ名前のC++ 11以前の関数もあることに注意してください。例:strtolとC++ 11 stolの比較。
これらはさまざまなベースでも機能しますが、同じ方法でエラー処理を実行しません(たとえば、「hello」を文字列)およびおそらくC++ 11バージョンを優先する必要があります。

私の要点を言うと、strtolとC++ 11 stolの両方に「Hello」を渡すと、次のようになります。

  • strtol0を返し、それをエラーとして識別する方法はありません。
  • C++ 11のstolstd::invalid_argumentをスローし、何かが間違っていることを示します。

"Hello"のようなものを整数として誤って解釈すると、バグが発生する可能性があるため、私の意見では回避する必要があります。

ただし、完全を期すために そのcppreferenceページ へのリンクも使用してください。

33
user1942027

strtol()2を最後の引数として使用する必要があるようです。

5
NPE