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

Estoy tratando de conseguir el nombre de la el valor de temp, el nombre de la nada antes de los dos puntos, en este caso se trata de «Prueba» y, a continuación, quiero aprovechar el nombre 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

}

Me da el error de que la función toupper espera un int, pero recibe un char *. La cosa es que, tengo que usar char *s, ya que es lo que la función de tomar en, (realmente no puedo usar char matrices de aquí, ¿puedo?).

Cualquier ayuda sería muy apreciada.

InformationsquelleAutor EDEDE | 2016-02-03

4 Comentarios

  1. 10

    toupper() convierte un solo char.

    Simplemente utilizar 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 la Biblioteca estándar de toupper(int) se define para todos los unsigned char y EOF. Desde char puede ser firmado, convertir a unsigned char.

    Algunos OS apoyo de una llamada a una función que hace esto: upstr() y strupr()

    • ¿Qué sistemas normalmente apoyo upstr? El Debian manual para upstr dice que es a partir de la «Alianza para el Sistema CAD.»
  2. 3

    toupper() sólo funciona en un solo carácter. Pero hay strupr() que es lo que quieres para un puntero a una cadena.

    • strupr no es estándar. Que yo sepa sólo se admite por parte de Microsoft de la biblioteca.
    • es apoyado también por el Greenhills y Borland. Pero tienes razón, no es en glibc.
  3. 1

    toupper() trabaja en un elemento (int argumento, el valor que van a la misma como de unsigned char o EF) en un tiempo.

    Prototipo:

    int toupper(int c);

    Necesita usar un bucle para el suministro de un elemento en un momento de su cadena.

    • Tal vez voy a borrar esta respuesta, ya que no agrega valor, pero ¿cuál es la razón para DV?
  4. 0

    Para aquellos de ustedes que quieren a mayúsculas una cadena y almacenar en una variable (que era lo que estaba buscando cuando me lea 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 quieres a minúsculas una cadena en su lugar, cambiar toupper(s[a]) a tolower(s[a]).

    • Curioso, ¿por qué tipo de uso de la unsigned long int s_len vs unsigned s_len o incluso mejor size_t s_len? Parece extraño el uso de unsigned long s_len y int a en a < s_len. Yo esperaría que las variables a ser del mismo tipo.
    • Honestamente soy nuevo en C y la programación en general, por lo que es muy probable que los tipos de variables no son las mejores.

Dejar respuesta

Please enter your comment!
Please enter your name here