std:: from_chars
|
Definido en el encabezado
<charconv>
|
||
|
std
::
from_chars_result
from_chars
(
const
char
*
first,
const
char
*
last,
|
(1) |
(desde C++17)
(constexpr desde C++23) |
|
std
::
from_chars_result
from_chars
(
const
char
*
first,
const
char
*
last,
|
(2) | (desde C++17) |
Analiza la secuencia de caracteres
[
first
,
last
)
para un patrón descrito a continuación. Si ningún carácter coincide con el patrón o si el valor obtenido al analizar los caracteres coincidentes no es representable en el tipo de
value
,
value
permanece sin modificar; de lo contrario, los caracteres que coinciden con el patrón se interpretan como una representación textual de un valor aritmético, que se almacena en
value
.
- "0x" o "0X" los prefijos no se reconocen si base es 16
- solo se reconoce el signo negativo (no el signo positivo), y solo para tipos enteros con signo de value
- los espacios en blanco iniciales no se ignoran.
- el signo más no se reconoce fuera del exponente (solo se permite el signo menos al principio)
-
si
fmttiene std::chars_format::scientific establecido pero no std::chars_format::fixed , la parte del exponente es obligatoria (de lo contrario es opcional) -
si
fmttiene std::chars_format::fixed establecido pero no std::chars_format::scientific , el exponente opcional no está permitido -
si
fmtes std::chars_format::hex , el prefijo "0x" o "0X" no está permitido (la cadena "0x123" se analiza como el valor "0" con resto no analizado "x123" ) - los espacios en blanco iniciales no se ignoran.
Contenidos |
Parámetros
| first, last | - | rango de caracteres válido para analizar |
| value | - | parámetro de salida donde se almacena el valor analizado si tiene éxito |
| base | - | base entera a utilizar: un valor entre 2 y 36 (inclusive). |
| fmt | - | formato de punto flotante a utilizar, una máscara de bits de tipo std::chars_format |
Valor de retorno
En caso de éxito, retorna un valor de tipo
std::from_chars_result
tal que
ptr
apunta al primer carácter que no coincide con el patrón, o tiene el valor igual a
last
si todos los caracteres coinciden y
ec
está inicializado por defecto.
Si no hay coincidencia de patrón, retorna un valor de tipo
std::from_chars_result
tal que
ptr
es igual a
first
y
ec
es igual a
std::errc::invalid_argument
.
value
no se modifica.
Si el patrón fue coincidido, pero el valor analizado no está en el rango representable por el tipo de
value
, retorna un valor de tipo
std::from_chars_result
tal que
ec
es igual a
std::errc::result_out_of_range
y
ptr
apunta al primer carácter que no coincide con el patrón.
value
permanece sin modificar.
Excepciones
No lanza nada.
Notas
A diferencia de otras funciones de análisis en bibliotecas de C++ y C,
std::from_chars
es independiente de la configuración regional, no realiza asignaciones de memoria y no lanza excepciones. Solo se proporciona un pequeño subconjunto de políticas de análisis utilizadas por otras bibliotecas (como
std::sscanf
). Esto está diseñado para permitir la implementación más rápida posible que sea útil en contextos comunes de alto rendimiento como el intercambio basado en texto (
JSON
o
XML
).
La garantía de que
std::from_chars
puede recuperar cada valor de punto flotante formateado por
std::to_chars
exactamente solo se proporciona si ambas funciones son de la misma implementación.
Un patrón que consiste en un signo sin dígitos siguientes se trata como un patrón que no coincidió con nada.
| Macro de prueba de características | Valor | Std | Característica |
|---|---|---|---|
__cpp_lib_to_chars
|
201611L
|
(C++17) |
Conversiones elementales de cadenas (
std::from_chars
,
std::to_chars
)
|
202306L
|
(C++26) | Prueba de éxito o fallo de funciones de <charconv> | |
__cpp_lib_constexpr_charconv
|
202207L
|
(C++23) |
Añadir modificadores
constexpr
a las sobrecargas de
std::from_chars
y
std::to_chars
para tipos integrales
|
Ejemplo
#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's constexpr from_char demo / C++26's operator bool() demo: 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 }
Salida:
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.
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Se aplica a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 2955 | C++17 | esta función estaba en <utility> y usaba std::error_code | movida a <charconv> y usa std::errc |
| LWG 3373 | C++17 |
std::from_chars_result
podría tener miembros adicionales
|
se prohíben los miembros adicionales |
Véase también
|
(C++17)
|
el tipo de retorno de
std::from_chars
(clase) |
|
(C++17)
|
convierte un valor entero o de punto flotante a una secuencia de caracteres
(función) |
|
(C++11)
(C++11)
(C++11)
|
convierte una cadena a un entero con signo
(función) |
|
(C++11)
(C++11)
(C++11)
|
convierte una cadena a un valor de punto flotante
(función) |
|
(C++11)
|
convierte una cadena de bytes a un valor entero
(función) |
|
convierte una cadena de bytes a un valor de punto flotante
(función) |
|
|
lee entrada formateada desde
stdin
, un flujo de archivo o un búfer
(función) |
|
|
extrae datos formateados
(función miembro pública de
std::basic_istream<CharT,Traits>
)
|