EDEDE
EDEDE

Reputation: 213

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.

Upvotes: 20

Views: 137654

Answers (5)

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++;
    }
}

Upvotes: 7

Mike
Mike

Reputation: 790

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]).

Upvotes: 10

chux
chux

Reputation: 154255

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()

Upvotes: 26

wallyk
wallyk

Reputation: 57784

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

Upvotes: 6

Sourav Ghosh
Sourav Ghosh

Reputation: 134356

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.

Upvotes: 4

Related Questions