C++ プログラミング:std::atoi を使って Strings を数値に変換する

2024-04-02

C++ の std::atoi と Strings

使い方

std::atoi は非常にシンプルで、以下の形式で使用されます。

int number = std::atoi(str.c_str());
  • number は変換結果を格納する変数 (整数型)
  • str は変換したい文字列 (std::string 型)
  • c_str()std::string 型を const char* 型に変換する関数

std::string str = "1234";
int number = std::atoi(str.c_str());

// number は 1234 になる

注意点

  • std::atoi は、文字列の先頭から空白文字を除いて、最初の数字からなる部分を変換します。
  • 数字以外の文字が最初に現れると、その時点で変換が停止し、それ以降の文字は無視されます。
  • 変換結果が整数型の範囲を超えると、処理が異常終了する可能性があります。

代替手段

std::atoi 以外にも、文字列から整数への変換にはいくつかの方法があります。

  • std::stringstream を使用する方法: より安全で柔軟な方法
  • std::stol / std::stoll / std::stoull を使用する方法: 10進数 / 16進数 / 10進数 (符号なし) への変換
  • std::atoi は C 言語の atoi 関数の C++ 版です。
  • std::atoi は非推奨 (deprecated) となっており、代わりに std::stoi などの使用が推奨されています。


std::atoi を使ったサンプルコード

#include <iostream>

int main() {
  std::string str = "1234";
  int number = std::atoi(str.c_str());

  std::cout << "str: " << str << std::endl;
  std::cout << "number: " << number << std::endl;

  return 0;
}

出力

str: 1234
number: 1234

空白文字を含む文字列

#include <iostream>

int main() {
  std::string str = "  1234  ";
  int number = std::atoi(str.c_str());

  std::cout << "str: " << str << std::endl;
  std::cout << "number: " << number << std::endl;

  return 0;
}

出力

str:   1234  
number: 1234

数字以外の文字を含む文字列

#include <iostream>

int main() {
  std::string str = "1234abc";
  int number = std::atoi(str.c_str());

  std::cout << "str: " << str << std::endl;
  std::cout << "number: " << number << std::endl;

  return 0;
}

出力

str: 1234abc
number: 1234

変換結果が範囲外の値

#include <iostream>
#include <limits>

int main() {
  std::string str = "2147483648"; // int型の最大値 + 1
  int number = std::atoi(str.c_str());

  std::cout << "str: " << str << std::endl;
  std::cout << "number: " << number << std::endl;

  return 0;
}

出力

str: 2147483648
number: -2147483648

std::stringstream を使用した方法

#include <iostream>
#include <sstream>

int main() {
  std::string str = "1234.56";
  int number;

  std::stringstream ss(str);
  ss >> number;

  std::cout << "str: " << str << std::endl;
  std::cout << "number: " << number << std::endl;

  return 0;
}

出力

str: 1234.56
number: 1234

std::stoi / std::stoll / std::stoull を使用する方法

#include <iostream>
#include <string>

int main() {
  std::string str = "1234";
  int number = std::stoi(str);

  std::cout << "str: " << str << std::endl;
  std::cout << "number: " << number << std::endl;

  return 0;
}

出力

str: 1234
number: 1234

これらのサンプルコードは、std::atoi の使い方を理解するのに役立ちます。



std::atoi 以外の文字列から整数への変換方法

std::stringstream は、文字列とストリーム間の変換を行うクラスです。std::stringstream を使用して、文字列を整数に変換することができます。

#include <iostream>
#include <sstream>

int main() {
  std::string str = "1234.56";
  int number;

  std::stringstream ss(str);
  ss >> number;

  std::cout << "str: " << str << std::endl;
  std::cout << "number: " << number << std::endl;

  return 0;
}

出力

str: 1234.56
number: 1234

std::stoi / std::stoll / std::stoull

C++11 以降では、std::stoi / std::stoll / std::stoull を使用して、文字列を整数に変換することができます。これらの関数は、それぞれ 10 進数、16 進数、10 進数 (符号なし) の文字列を整数に変換します。

#include <iostream>
#include <string>

int main() {
  std::string str = "1234";
  int number = std::stoi(str);

  std::cout << "str: " << str << std::endl;
  std::cout << "number: " << number << std::endl;

  return 0;
}

出力

str: 1234
number: 1234

その他の方法

上記以外にも、以下のような方法があります。

  • 手動で変換する
  • 自作の関数を作成する
  • ライブラリを使用する

それぞれの方法にはメリットとデメリットがあります。

std::stringstream は比較的シンプルで使いやすい方法です。

std::stoi/std::stoll/std::stoull` は、より効率的で安全な方法です。




はじめてのstd::basic_string::begin関数: C++のStringクラスの先頭へのアクセス

std::basic_stringクラスは、文字列の格納と操作を行うためのテンプレートクラスです。このクラスは、様々な文字型に対応できる汎用的な設計になっています。std::basic_string::begin関数は、std::basic_stringクラスのメンバー関数であり、以下の役割を果たします。



C++ Stringsにおけるstd::basic_string_view::rfind

概要std::basic_string_view::rfind は、部分文字列と検索を開始する位置を受け取り、部分文字列が最後に出現する位置を返します。部分文字列が見つからない場合は、std::basic_string_view::npos が返されます。


C++ プログラミング:std::basic_string_view::empty を使って空の文字列ビューを検出する

概要機能: 文字列ビューが空かどうかを確認戻り値: 空の場合: true 空でない場合: false空の場合: true空でない場合: falseヘッダーファイル: <string_view>使用例:詳細std::basic_string_view は、C++17で導入されたクラスです。これは、std::string クラスと似ていますが、文字列を所有せず、参照のみを提供します。


C++ の Strings における std::basic_string::crend の詳細解説

std::basic_string::crend は、C++ 標準ライブラリ std::string クラスのメンバー関数であり、逆順イテレータ を返します。このイテレータは、文字列の最後の文字の次を指します。つまり、文字列の逆順の終わり を表します。


std::basic_string::clear を使いこなして C++ プログラミングをレベルアップ!

std::basic_string::clear の概要文字列オブジェクトからすべての文字を削除します。メモリ解放は行われません。容量は変更されない可能性が高いです。すべてのポインタ、参照、イテレータは無効化されます。std::basic_string::clear は、std::string::erase(begin(), end()) と同じように動作します。つまり、文字列の先頭から末尾までのすべての文字が削除されます。



C++ プログラマー必見: 推論ガイドによる std::basic_string の使いこなし

C++20 では、std::basic_string クラスのための推論ガイドが導入されました。これは、コンパイラがテンプレート引数を自動的に推論し、コードをより簡潔に記述できる機能です。推論ガイドとは?推論ガイドは、テンプレート引数を明示的に指定しなくても、コンパイラがテンプレート引数を自動的に推論できる仕組みです。これは、コードの冗長性を減らし、可読性を向上させるのに役立ちます。


std::basic_string::dataを使いこなして、C++プログラミングをもっと楽しく!

概要std::basic_string::data は、std::basic_string オブジェクト内の文字列データへのポインタを返します。返されたポインタは、const であり、文字列データの変更はできません。返されたポインタは、std::basic_string オブジェクトの生存期間中は有効です。


std::basic_string::find_first_ofとfind_first_not_ofの違い

std::basic_string::find_first_of は、C++標準ライブラリで提供される関数の一つで、文字列内における特定の文字列や文字集合の最初の出現位置を検索します。この関数は、文字列操作において非常に便利でよく使用される関数の一つです。


C++ std::basic_string::ends_with 関数徹底解説

std::basic_string::ends_with 関数は、指定された文字列がストリングの末尾に一致するかどうかを検証します。一致する場合は true、一致しない場合は false を返します。構文パラメータsv: 一致させる文字列を表す std::basic_string_view オブジェクト


C++ Strings: std::basic_string::assign_range 関数徹底解説

std::basic_string::assign_range は、C++ 標準ライブラリ std::string クラスのメンバー関数で、指定された範囲の要素を使って文字列の内容を置き換えます。これは、文字列を効率的に初期化または変更したい場合に便利な関数です。