'Converting char * to Uppercase in C

I'm trying to convert a char * to uppercase in c, but the function toupper() doesn't work here.

I'm trying to get the name of the the value of temp, the name being anything before the colon, in this case it's "Test", and then I want to capitalize the name fully.

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
 
}

I'm getting the error that the function toupper() expects an int, but receives a char *. Thing is, I have to use char *s, since that is what the function is taking in, (I can't really use char arrays here, can I?).

Any help would be greatly appreciated.



Solution 1:[1]

toupper() converts a single char.

Simply use a loop:

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

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

}

Detail: The standard Library function toupper(int) is defined for all unsigned char and EOF. Since char may be signed, convert to unsigned char.

Some OS's support a function call that does this: upstr() and strupr()

Solution 2:[2]

For those of you who want to uppercase a string and store it in a variable (that was what I was looking for when I read these answers).

#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.
}

Note: If you want to lowercase a string instead, change toupper(s[a]) to tolower(s[a]).

Solution 3:[3]

toupper() works only on a single character. But there is strupr() which is what you want for a pointer to a string.

Solution 4:[4]

How about this little function? It assumes ASCII represented chars and modifies string in place.

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

Solution 5:[5]

toupper() works on one element (int argument, value ranging the same as of unsigned char or EOF) at a time.

Prototype:

int toupper(int c);

You need to use a loop to supply one element at a time from your string.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Mike
Solution 3 wallyk
Solution 4 João Pedro Nascimento
Solution 5 Sourav Ghosh