Convirtiendo char * a Mayúsculas en C

4 minutos de lectura

Avatar de usuario de EDEDE
EDEDE

Estoy tratando de convertir un char * a mayúsculas en c, pero la función toupper() no funciona aquí

Estoy tratando de obtener el nombre del valor de la temperatura, el nombre es cualquier cosa antes de los dos puntos, en este caso es “Prueba”, y luego quiero poner el nombre en mayúsculas por completo.

void func(char * temp) {
 // where temp is a char * containing the string "Test:Case1"
 char * name;

 name = strtok(temp,":");

 //convert it to uppercase

 name = toupper(name); //error here
 
}

Recibo el error de que la función toupper() espera un intpero recibe un char *. La cosa es que tengo que usar char *s, ya que eso es lo que está tomando la función, (realmente no puedo usar char matrices aquí, ¿puedo?).

Cualquier ayuda sería muy apreciada.

chux - Restablecer el avatar de usuario de Monica
chux – Reincorporar a Monica

toupper() convierte un solo char.

Simplemente use un bucle:

void func(char * temp) {
  char * name;
  name = strtok(temp,":");

  // Convert to upper case
  char *s = name;
  while (*s) {
    *s = toupper((unsigned char) *s);
    s++;
  }

}

Detalle: la función de biblioteca estándar toupper(int) se define para todos unsigned char y EOF. Ya que char puede ser firmado, convertir a unsigned char.

Algunos sistemas operativos admiten una llamada de función que hace esto: upstr() y strupr()

  • Qué sistemas normalmente admiten upstr? los Página de manual de Debian por upstr dice que es del “Sistema CAD de Alliance”.

    – papá falso

    22 de septiembre de 2019 a las 6:00


Para aquellos de ustedes que quieren poner en mayúscula una cadena y guardarlo en una variable (eso era lo que estaba buscando cuando leí estas respuestas).

#include <stdio.h>  //<-- You need this to use printf.
#include <string.h>  //<-- You need this to use string and strlen() function.
#include <ctype.h>  //<-- You need this to use toupper() function.

int main(void)
{
    string s = "I want to cast this";  //<-- Or you can ask to the user for a string.

    unsigned long int s_len = strlen(s); //<-- getting the length of 's'.  

    //Defining an array of the same length as 's' to, temporarily, store the case change.
    char s_up[s_len]; 

    // Iterate over the source string (i.e. s) and cast the case changing.
    for (int a = 0; a < s_len; a++)
    {
        // Storing the change: Use the temp array while casting to uppercase.  
        s_up[a] = toupper(s[a]); 
    }

    // Assign the new array to your first variable name if you want to use the same as at the beginning
    s = s_up;

    printf("%s \n", s_up);  //<-- If you want to see the change made.
}

Nota: Si desea poner en minúsculas una cadena en su lugar, cambie toupper(s[a]) a tolower(s[a]).

  • Curioso, ¿por qué usar el tipo? unsigned long int s_len contra unsigned s_len o mejor size_t s_len? Parece raro de usar unsigned long s_len y int a en a < s_len. Espero que las variables sean del mismo tipo.

    – chux – Reincorporar a Monica

    4 de junio de 2019 a las 14:18

  • Honestamente, soy nuevo en C y en la programación en general, por lo que es bastante probable que los tipos de variables no sean los mejores.

    – Miguel

    11/06/2019 a las 20:55

¿Qué tal esta pequeña función? Asume caracteres representados por ASCII y modifica la cadena en su lugar.

void to_upper(char* string)
{
    const char OFFSET = 'a' - 'A';
    while (*string)
    {
        *string = (*string >= 'a' && *string <= 'z') ? *string -= OFFSET : *string;
        string++;
    }
}

  • esto da bus error cuando se compila con -Wall -Wextra -Werror

    – sinsajo

    27 ago a las 9:39

toupper() funciona solo en un solo personaje. Pero hay strupr() que es lo que quieres para un puntero a una cadena.

toupper() funciona en un elemento (int argumento, valor que varía lo mismo que de unsigned char o EOF) a la vez.

Prototipo:

int toupper(int c);

Necesita usar un bucle para suministrar un elemento a la vez desde su cuerda.

  • Tal vez elimine esta respuesta, ya que no agrega valor, pero ¿cuál es el motivo de DV?

    – Sourav Ghosh

    4 de febrero de 2016 a las 15:49

  • Tal vez elimine esta respuesta, ya que no agrega valor, pero ¿cuál es el motivo de DV?

    – Sourav Ghosh

    4 de febrero de 2016 a las 15:49

¿Ha sido útil esta solución?