Namespaces
Variants

std:: from_chars

From cppreference.net
Défini dans l'en-tête <charconv>
std :: from_chars_result

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

/* integer-type */ & value, int base = 10 ) ;
(1) (depuis C++17)
(constexpr depuis C++23)
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) (depuis C++17)

Analyse la séquence de caractères [ first , last ) selon un motif décrit ci-dessous. Si aucun caractère ne correspond au motif ou si la valeur obtenue en analysant les caractères correspondants n'est pas représentable dans le type de value , value reste inchangé, sinon les caractères correspondant au motif sont interprétés comme une représentation textuelle d'une valeur arithmétique, qui est stockée dans value .

1) Analyseurs d'entiers : Attend un motif identique à celui utilisé par std::strtol dans la locale par défaut ("C") et la base numérique non nulle donnée, sauf que
  • "0x" ou "0X" ne sont pas reconnus si base vaut 16
  • seul le signe moins est reconnu (pas le signe plus), et uniquement pour les types entiers signés de value
  • les espaces blancs en tête ne sont pas ignorés.
La bibliothèque fournit des surcharges pour tous les types entiers signés et non signés sans qualificatif cv (depuis C++23) et pour char comme type référencé du paramètre value .
2) Analyseurs de nombres à virgule flottante : Attend un motif identique à celui utilisé par std::strtod dans la locale par défaut ("C"), sauf que
Dans tous les cas, la valeur résultante est l'une des deux valeurs en virgule flottante au plus les plus proches de la valeur de la chaîne correspondant au motif, après arrondi selon std::round_to_nearest .
La bibliothèque fournit des surcharges pour tous les types standard (until C++23) à virgule flottante non qualifiés cv comme type référencé du paramètre value .

Table des matières

Paramètres

first, last - plage de caractères valide à analyser
value - paramètre de sortie où la valeur analysée est stockée en cas de succès
base - base entière à utiliser : une valeur comprise entre 2 et 36 (inclus).
fmt - formatage en virgule flottante à utiliser, un masque de bits de type std::chars_format

Valeur de retour

En cas de succès, retourne une valeur de type std::from_chars_result telle que ptr pointe vers le premier caractère ne correspondant pas au motif, ou ait la valeur égale à last si tous les caractères correspondent et ec est initialisé à sa valeur par défaut.

S'il n'y a pas de correspondance de motif, retourne une valeur de type std::from_chars_result telle que ptr soit égal à first et ec soit égal à std::errc::invalid_argument . value n'est pas modifié.

Si le motif a été trouvé, mais que la valeur analysée n'est pas dans la plage représentable par le type de value , retourne une valeur de type std::from_chars_result telle que ec est égal à std::errc::result_out_of_range et ptr pointe vers le premier caractère ne correspondant pas au motif. value n'est pas modifié.

Exceptions

Ne lance rien.

Notes

Contrairement aux autres fonctions d'analyse dans les bibliothèques C++ et C, std::from_chars est indépendant des paramètres régionaux, n'effectue pas d'allocation et ne lève pas d'exceptions. Seul un petit sous-ensemble des politiques d'analyse utilisées par d'autres bibliothèques (telles que std::sscanf ) est fourni. Cela vise à permettre l'implémentation la plus rapide possible, utile dans des contextes courants à haut débit tels que l'échange de données textuelles ( JSON ou XML ).

La garantie que std::from_chars peut récupérer chaque valeur à virgule flottante formatée par std::to_chars exactement n'est fournie que si les deux fonctions proviennent de la même implémentation.

Un motif constitué d'un signe sans chiffres le suivant est traité comme un motif qui n'a rien correspondre.

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_to_chars 201611L (C++17) Conversions élémentaires de chaînes ( std::from_chars , std::to_chars )
202306L (C++26) Test de réussite ou d'échec des fonctions <charconv>
__cpp_lib_constexpr_charconv 202207L (C++23) Ajout des modificateurs constexpr aux surcharges de std::from_chars et std::to_chars pour les types entiers

Exemple

#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 << "Ceci n'est pas un nombre.\n";
        else if (ec == std::errc::result_out_of_range)
            std::cout << "Ce nombre est plus grand qu'un int.\n";
    }
    // Démonstration de from_char constexpr de C++23 / Démonstration de operator bool() de C++26 :
    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
}

Sortie :

String: "1234". Result: 1234, ptr -> ""
String: "15 foo". Result: 15, ptr -> " foo"
String: "bar". Ceci n'est pas un nombre.
String: " 42". Ceci n'est pas un nombre.
String: "5000000000". Ce nombre est plus grand qu'un int.

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Applicable à Comportement publié Comportement corrigé
LWG 2955 C++17 cette fonction se trouvait dans <utility> et utilisait std::error_code déplacée vers <charconv> et utilise std::errc
LWG 3373 C++17 std::from_chars_result pouvait avoir des membres supplémentaires les membres supplémentaires sont interdits

Voir aussi

le type de retour de std::from_chars
(classe)
(C++17)
convertit une valeur entière ou à virgule flottante en séquence de caractères
(fonction)
(C++11) (C++11) (C++11)
convertit une chaîne en entier signé
(fonction)
(C++11) (C++11) (C++11)
convertit une chaîne en valeur à virgule flottante
(fonction)
convertit une chaîne d'octets en valeur entière
(fonction)
convertit une chaîne d'octets en valeur à virgule flottante
(fonction)
lit une entrée formatée depuis stdin , un flux de fichier ou un tampon
(fonction)
extrait des données formatées
(fonction membre publique de std::basic_istream<CharT,Traits> )