「std::stoi」の版間の差分

提供: C++入門
移動: 案内検索
(ページの作成:「std::stoi とは、文字列を数値に変換する関数です。10進数、16進数、8進数などの文字列を整数(int)に変換できます。C言語で...」)
 
 
行1: 行1:
[[std::stoi]] とは、文字列を数値に変換する関数です。10進数、16進数、8進数などの文字列を整数(int)に変換できます。C言語で言えば、atoiやstrtolにあたります。atoiとの大きな違いは、std::stringをダイレクトに渡せることでしょう。atoiでは、std::stringを直接渡せないため、c_str()の呼び出しが必要です。
+
[[std::stoi]] とは、文字列を数値に変換する関数です。10進数、16進数、8進数などの文字列を整数(int)に変換できます。C言語で言えば、sscanf,atoiやstrtolにあたります。atoiとの大きな違いは、std::stringをダイレクトに渡せることでしょう。atoiでは、std::stringを直接渡せないため、c_str()の呼び出しが必要です。
  
 
'''読み方'''
 
'''読み方'''
行19: 行19:
 
* double std::stod
 
* double std::stod
 
* long double std::stold
 
* long double std::stold
 +
 +
[[std::hex]]と[[std::istringstream]]を組み合わせることで変換自体はできますが、[[std::stoi]]のほうが単純です。
  
 
== プロトタイプ ==
 
== プロトタイプ ==

2014年8月27日 (水) 16:28時点における最新版

std::stoi とは、文字列を数値に変換する関数です。10進数、16進数、8進数などの文字列を整数(int)に変換できます。C言語で言えば、sscanf,atoiやstrtolにあたります。atoiとの大きな違いは、std::stringをダイレクトに渡せることでしょう。atoiでは、std::stringを直接渡せないため、c_str()の呼び出しが必要です。

読み方

std::stoi
えすてぃーでぃー えす とぅー あい

概要

std::stoiは、std::stringか、std::wstringを扱えます。第3引数で基数を指定できます。 第3引数に0を指定した場合、基数が自動的に選択されます。

  • 先頭が0の場合は、8進数
  • 先頭が0xもしくは、0Xの場合は、16進数

std::stoiのファミリには、以下のシリーズがあります。

  • long std::stol
  • long long std::stoll
  • unsigned long std::stoul
  • unsigned long long std::stoull
  • float std::stof
  • double std::stod
  • long double std::stold

std::hexstd::istringstreamを組み合わせることで変換自体はできますが、std::stoiのほうが単純です。

プロトタイプ

namespace std {
  int stoi(const string& str, size_t* idx = nullptr, int base = 10);
  int stoi(const wstring& str, size_t* idx = nullptr, int base = 10);
}

例外

  • 数値への変換が行われない場合は、std::invalid_argument が送出されます。
  • 範囲外の値になった場合は、std::out_of_rangeが送出されます。

文字列を整数に置き換える例 stoi1.cpp

文字列(10進数形式、8進数形式、16進数形式)を整数に変換する例です。

ソースコード stoi1.cpp

/*
 * stoi1.cpp
 * Copyright (C) 2014 kaoru <kaoru@bsd>
 */
 
#include <iostream>
#include <string>
 
using namespace std;
 
int
main(int argc, char const* argv[])
{
        string d10 = "10";      // 10進数
        string o80 = "010";     // 8進数
        string xFF = "0xFF";    // 16進数
        string FF = "FF";       // 16進数, 0xなし
        int a = std::stoi(d10); // 10進数
        int b = std::stoi(o80, nullptr, 8);     // 8進数
        int c = std::stoi(xFF, nullptr, 16);    // 16進数
        int d = std::stoi(FF, nullptr, 16);     // 16進数, 0xなし
        cout << a << endl;
        cout << b << endl;
        cout << c << endl;
        cout << d << endl;
        return 0;
}

コンパイル

c++  stoi1.cpp -o stoi1

実行例

% ./stoi1
10
8
255
255

例外を送出する例 stoi2.cpp

ソースコード stoi2.cpp

/*
 * stoi2.cpp
 * Copyright (C) 2014 kaoru <kaoru@bsd>
 */
#include <iostream>
#include <string>
 
using namespace std;
 
int
main(int argc, char const* argv[])
{
        try {
                int a = std::stoi("hoge");
        } catch (std::invalid_argument e) {
                cout << e.what() << endl;
        } catch (std::out_of_range e) {
                cout << e.what() << endl;
        }
 
        try {
                int a = std::stoi("999999999999");
        } catch (std::invalid_argument e) {
                cout << e.what() << endl;
        } catch (std::out_of_range e) {
                cout << e.what() << endl;
        }
 
        return 0;
}

コンパイル

c++  stoi2.cpp -o stoi2

実行例

% ./stoi2
stoi: no conversion
stoi: out of range

関連項目