lower - toupper c++
¿Qué tolower en C++? (3)
Debe tenerse en cuenta que los diseñadores de idiomas estaban al tanto del cctype de cctype cuando se creó el tolower locale . Mejoró en 2 formas primarias:
- Como se menciona en la respuesta de progress_overload, la versión de
localepermitió el uso del tipo defacet ctype, incluso un usuario modificado, sin requerir la combinación de un nuevoLC_CTYPEa través desetlocaley la restauración del anteriorLC_CTYPE - De la sección 7.1.6.2 [dcl.type.simple] 3:
Se define por la implementación si los objetos de tipo
charse representan como cantidades firmadas o no firmadas. El especificadorsignedobliga a los objetoschara ser firmados
Lo que crea un potencial de comportamiento indefinido con la versión cctype de tolower ''s si es argumento:
No se puede representar como
unsigned chary no es igual aEOF
Por lo tanto, hay una entrada y salida static_cast adicional requerida por la versión cctype la cctype de tolower :
transform(cbegin(foo), cend(foo), begin(foo), [](const unsigned char i){ return tolower(i); });
Como la versión de locale opera directamente en caracteres, no es necesario realizar una conversión de tipo.
Entonces, si no necesita realizar la conversión en un facet ctype diferente, simplemente se convierte en una pregunta de estilo si prefiere la transform con un lambda requerido por la versión de cctype , o si prefiere las versiones de locale :
use_facet<ctype<char>>(cout.getloc()).tolower(data(foo), next(data(foo), size(foo)));
Dada la string foo , he escrito answers sobre cómo usar el tolower cctype para convertir los caracteres en minúsculas
transform(cbegin(foo), cend(foo), begin(foo), static_cast<int (*)(int)>(tolower))
Pero he empezado a considerar el tolower locale , que podría ser usado así:
use_facet<ctype<char>>(cout.getloc()).tolower(data(foo), next(data(foo), foo.size()));
- ¿Hay alguna razón para preferir uno de estos sobre el otro?
- ¿Su funcionalidad difiere en absoluto?
- Me refiero a que, aparte del hecho de que
toloweracepta y devuelve unint¿se supone que son solo algunas cosas anticuadas de C?
Desafortunadamente, ambos son igualmente malos. Aunque std::string pretende ser una cadena codificada en utf-8, ninguno de los métodos / función (incluido tolower), realmente es consciente de utf-8. Por lo tanto, tolower / tolower + locale puede funcionar con caracteres que son de un solo byte (= ASCII), que fallarán para todos los demás conjuntos de idiomas.
En Linux, usaría la biblioteca de ICU. En Windows, CharUpper función CharUpper .
En el primer caso (cctype) la configuración regional se establece implícitamente:
Convierte el carácter dado en minúsculas según las reglas de conversión de caracteres definidas por la configuración regional C instalada actualmente.
En el segundo caso (configuración regional), debe establecer explícitamente la configuración regional:
Convierte el parámetro c en su equivalente en minúscula si c es una letra mayúscula y tiene un equivalente en minúscula, según lo determine la faceta ctype de locale locale. Si no es posible dicha conversión, el valor devuelto no se modifica.