3

Mi pregunta es muy breve, es como podría convertir una letra en mayúsculas de un carácter, en mi caso un char lo pueda pasar a minúsculas. Ej:

char key[16];
key = "A"

Como podría hacer la conversión para que mi char fuera minúscula. He intentado usando tolower pero tiene que ser un entero, ej:

key = tolower(*key);

En mi caso me devuelve el siguiente error:

 incompatible types in assignment of 'int' to 'char [16]'|
Sergio Ramos
  • 584
  • 3
  • 9
  • 30

2 Answers2

3

Mi pregunta es muy breve.

Sin embargo la respuesta es muy larga ¡Empecemos!

Respuesta corta.

Puedes usar std::tolower así:

   *key = std::tolower(*key);
// ^------ Des-referencia el puntero.

Respuesta larga.

Tenemos dos versiones de std::tolower:

  • En la cabecera <cctype>:

    int tolower( int ch );
    
  • En la cabecera <locale>:

    template< class charT >
    charT tolower( charT ch, const std::locale& loc ) {
        return std::use_facet<std::ctype<charT>>(loc).tolower(ch);
    }
    

La versión de la cabecera <cctype> pertenece a las librerías de C mientras que la cabecera <locale> pertenece a las librerías de C++. Si estás programando en C++ deberías usar <locale>.

Además de lo dicho en el parágrafo anterior ¿por qué es mejor la versión de <locale> respecto a la versión de <cctype>?:

  • La versión C transforma el carácter (char) a entero (recibe un int) y devuelve un entero (devuelve int) que tendrá que ser transformado de nuevo a carácter (char).
  • La versión C++ es una plantilla que recibe un tipo genérico de carácter (charT) y lo transforma a minúsculas usando la configuración local de lenguaje; así que no sólo tiene en cuenta todos los tipos de carácter (char, wchar_t, char16_t y char32_t) sin hacer transformaciones de datos ¡también tiene en cuenta el idioma en que están escritos!

Así que para pasar a minúsculas un carácter usando la configuración de idioma configurada harías:

// Usa el idioma actual -----v
   *key = std::tolower(*key, std::locale(""));
// ^------ Des-referencia el puntero.

Otras cosas a tener en cuenta.

Hacer esto es ¡terrible!

char key[16];
key = "A";

Solicitas 16 caracteres y luego re-asignas el puntero ¡eso no está permitido en C++ y por ello te sale el error incompatible types in assignment of 'int' to 'char [16]', para crear una key que contenga "A" debes hacer así:

char key[16] = "A";
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
  • 1
    El apartado de cosas a tener en cuenta está mal. Los arrays con corchetes no son "_reasignables_". De hecho si haces la prueba obtendrás un error tal que: `error: array type 'char [16]' is not assignable` – eferion May 03 '17 at 07:37
  • Efectivamente, ese es el error que le da al usuario, se me olvidó añadirlo. Gracias. – PaperBirdMaster May 03 '17 at 07:38
3

teniendo encuenta su pregunta -> Poner un char en minúsculas usando C++, no entrando en detalles ya mencionados por eferion por ejemplo y mostrado por PaperBirdMaster en su pregunta sobre el error del tipo is not assignable, usted puede usar la diferencia que existe en la tabla ASCII

introducir la descripción de la imagen aquí

en entre los caracteres en mayusculas y los mismos pero en minusculas, las minusculas estan, por decirlo de alguna manera a 32 posiciones de distancia entre el mismo caracter en mayusculas, sabiendo esto usted puede hacer algo como lo siguiente (simple ejemplo sobre un char):

#include <iostream>
using namespace std;

int main() {
    // your code goes here
    char key = 'A';

    char test = key + 32;

    std::cout << key << std::endl;
    std::cout << test << std::endl;

    std::cout << (key += 32) << std::endl;
    return 0;
}

stdout:

A
a
a

Test Ideone

P.D: Para poner una miniscula en mayuscula, solo tendria que usar -= 32 por ejemplo en lugar de += 32.


Angel Angel
  • 9,623
  • 9
  • 37
  • 68
  • simplemente le dejo esta respuesta por curiosidad, ademas nunca se sabe cuando le sera util, el conocer este detalle. Saludos – Angel Angel May 03 '17 at 13:25
  • 1
    ¿ eferion o paperbirdmaster ? – Trauma May 03 '17 at 13:42
  • @Trauma updete quizas de esta forma esta mas claro.Saludos – Angel Angel May 03 '17 at 14:02
  • 1
    Ten en cuenta que el *truco* de sumar 32 no funciona con el [infame EBCDIC](https://es.wikipedia.org/wiki/EBCDIC) (que por suerte *creo que* está en desuso) ni con [UTF](https://es.wikipedia.org/wiki/UTF-8) multibyte. Y sin duda no funciona en alfabetos exóticos. – PaperBirdMaster May 03 '17 at 15:43
  • @PaperBirdMaster gracias por lo que comenta de EBCDIC, nunca lo use pero es bueno saberlo, pense en poner algo sobre la codificaciones pero despues lo descarte, por otro lado eso que dice de UTF, no se que tan cierto sera, "nunca lo use", pero en algun texto dice algo asi -> **La codificación es de longitud variable y utiliza 8 bits ... fue diseñado para la compatibilidad hacia atras con ASCII** o cosas como esta otra -> **UTF-8 codificacion de longitud, 1-4 bytes por punto de codigo, valores ASCII se codifican como ASCII usando 1 byte.** pero igual es cierto lo que dice nunca lo use. Saludos – Angel Angel May 03 '17 at 15:56
  • @AngelAngel me alegro de que no hayas trabajado con EBCDIC y por el bien de tu salud, espero que siga así por mucho tiempo. – PaperBirdMaster May 04 '17 at 08:44