Namespaces
Variants

std:: from_chars

From cppreference.net
ヘッダーで定義 <charconv>
std :: from_chars_result

from_chars ( const char * first, const char * last,

/* integer-type */ & value, int base = 10 ) ;
(1) (C++17以降)
(C++23以降constexpr)
std :: from_chars_result

from_chars ( const char * first, const char * last,
/* floating-point-type */ & value,

std:: chars_format fmt = std :: chars_format :: general ) ;
(2) (C++17以降)

以下のパターンに従って文字シーケンス [ first , last ) を解析します。パターンに一致する文字がない場合、または解析された文字列が value の型で表現できない値の場合、 value は変更されません。それ以外の場合、パターンに一致する文字は数値のテキスト表現として解釈され、その値が value に格納されます。

1) 整数パーサー: デフォルト("C")ロケールおよび指定された非ゼロの数値基数において、 std::strtol で使用されるパターンと同一のパターンを期待します。ただし以下の例外があります:
  • "0x" または "0X" プレフィックスは、 base が16の場合には認識されません
  • マイナス記号のみが認識され(プラス記号は認識されず)、 value の符号付き整数型に対してのみ有効です
  • 先頭の空白文字は無視されません
ライブラリは、 cv修飾なし (C++23以降) のすべての符号付きおよび符号なし整数型と、 char に対するパラメータ value の参照型についてオーバーロードを提供します。
2) 浮動小数点パーサー: デフォルト("C")ロケールで使用される std::strtod と同じパターンを期待しますが、以下の点が異なります:
  • 指数部以外ではプラス記号は認識されません(先頭ではマイナス記号のみが許可されます)
  • fmt std::chars_format::scientific を設定しているが std::chars_format::fixed を設定していない場合、指数部は必須です(それ以外の場合はオプションです)
  • fmt std::chars_format::fixed を設定しているが std::chars_format::scientific を設定していない場合、オプションの指数部は許可されません
  • fmt std::chars_format::hex の場合、プレフィックス "0x" または "0X" は許可されません(文字列 "0x123" は値 "0" として解析され、未解析の残りは "x123" となります)
  • 先頭の空白は無視されません。
いずれの場合でも、結果の値は、文字列がパターンに一致する値に対して、 std::round_to_nearest に従って丸めた後、最大2つの浮動小数点値のうちの1つとなります。
このライブラリは、パラメータ value の参照型として、すべてのCV修飾されていない 標準 (until C++23) 浮動小数点型に対するオーバーロードを提供します。

目次

パラメータ

first, last - パースする有効な文字範囲
value - 成功時にパースされた値が格納される出力パラメータ
base - 使用する整数基数:2から36までの値(両端を含む)
fmt - 使用する浮動小数点フォーマット、 std::chars_format 型のビットマスク

戻り値

成功時は、型 std::from_chars_result の値を返し、 ptr がパターンに一致しない最初の文字を指すか、すべての文字が一致する場合は last と等しい値を持ち、 ec は値初期化された状態となる。

パターンが一致しない場合、型 std::from_chars_result の値を返し、 ptr first と等しく、 ec std::errc::invalid_argument と等しくなるようにします。 value は変更されません。

パターンが一致したが、解析された値が value の型で表現可能な範囲内にない場合、 std::from_chars_result 型の値を返し、 ec std::errc::result_out_of_range に等しく、 ptr がパターンに一致しない最初の文字を指すようにする。 value は変更されない。

例外

例外を送出しません。

注記

C++およびCライブラリの他の解析関数とは異なり、 std::from_chars はロケール非依存、メモリ確保なし、例外送出なしの特性を持ちます。他のライブラリ(例えば std::sscanf など)で使用される解析ポリシーのごく一部のみが提供されています。これは、テキストベースのデータ交換( JSON XML )のような一般的な高スループット環境で有用な、可能な限り最速の実装を可能にすることを目的としています。

std::from_chars std::to_chars によってフォーマットされたすべての浮動小数点値を正確に復元できるという保証は、両方の関数が同じ実装からのものである場合にのみ提供されます。

数字が後に続かない符号からなるパターンは、何にもマッチしなかったパターンとして扱われます。

機能テスト マクロ 標準 機能
__cpp_lib_to_chars 201611L (C++17) 基本的な文字列変換 ( std::from_chars , std::to_chars )
202306L (C++26) <charconv> 関数の成功・失敗のテスト
__cpp_lib_constexpr_charconv 202207L (C++23) 整数型に対する std::from_chars および std::to_chars オーバーロードへの constexpr 修飾子の追加

#include <cassert>
#include <charconv>
#include <iomanip>
#include <iostream>
#include <optional>
#include <string_view>
#include <system_error>
int main()
{
    for (std::string_view const str : {"1234", "15 foo", "bar", " 42", "5000000000"})
    {
        std::cout << "String: " << std::quoted(str) << ". ";
        int result{};
        auto [ptr, ec] = std::from_chars(str.data(), str.data() + str.size(), result);
        if (ec == std::errc())
            std::cout << "Result: " << result << ", ptr -> " << std::quoted(ptr) << '\n';
        else if (ec == std::errc::invalid_argument)
            std::cout << "This is not a number.\n";
        else if (ec == std::errc::result_out_of_range)
            std::cout << "This number is larger than an int.\n";
    }
    // C++23のconstexpr from_charsデモ / C++26のoperator bool()デモ:
    auto to_int = [](std::string_view s) -> std::optional<int>
    {
        int value{};
#if __cpp_lib_to_chars >= 202306L
        if (std::from_chars(s.data(), s.data() + s.size(), value))
#else
        if (std::from_chars(s.data(), s.data() + s.size(), value).ec == std::errc{})
#endif
            return value;
        else
            return std::nullopt;
    };
    assert(to_int("42") == 42);
    assert(to_int("foo") == std::nullopt);
#if __cpp_lib_constexpr_charconv and __cpp_lib_optional >= 202106
    static_assert(to_int("42") == 42);
    static_assert(to_int("foo") == std::nullopt);
#endif
}

出力:

String: "1234". Result: 1234, ptr -> ""
String: "15 foo". Result: 15, ptr -> " foo"
String: "bar". This is not a number.
String: " 42". This is not a number.
String: "5000000000". This number is larger than an int.

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 2955 C++17 この関数は <utility> にあり、 std::error_code を使用していた <charconv> に移動され、 std::errc を使用する
LWG 3373 C++17 std::from_chars_result に追加メンバーが存在する可能性があった 追加メンバーは禁止される

関連項目

std::from_chars の戻り値型
(クラス)
(C++17)
整数または浮動小数点値を文字シーケンスに変換する
(関数)
(C++11) (C++11) (C++11)
文字列を符号付き整数に変換する
(関数)
(C++11) (C++11) (C++11)
文字列を浮動小数点値に変換する
(関数)
バイト文字列を整数値に変換する
(関数)
バイト文字列を浮動小数点値に変換する
(関数)
stdin 、ファイルストリーム、またはバッファから書式化された入力を読み取る
(関数)
書式化されたデータを抽出する
( std::basic_istream<CharT,Traits> の公開メンバ関数)