Search code examples
c++stringsyntaxtoupper

C++ toupper Syntax


I've just been introduced to toupper, and I'm a little confused by the syntax; it seems like it's repeating itself. What I've been using it for is for every character of a string, it converts the character into an uppercase character if possible.

for (int i = 0; i < string.length(); i++)
{
    if (isalpha(string[i]))
    {
        if (islower(string[i]))
        {
            string[i] = toupper(string[i]);
        }
    }
}

Why do you have to list string[i] twice? Shouldn't this work? toupper(string[i]); (I tried it, so I know it doesn't.)


Solution

  • toupper is a function that takes its argument by value. It could have been defined to take a reference to character and modify it in-place, but that would have made it more awkward to write code that just examines the upper-case variant of a character, as in this example:

    // compare chars case-insensitively without modifying anything
    if (std::toupper(*s1++) == std::toupper(*s2++))
      ...
    

    In other words, toupper(c) doesn't change c for the same reasons that sin(x) doesn't change x.


    To avoid repeating expressions like string[i] on the left and right side of the assignment, take a reference to a character and use it to read and write to the string:

    for (size_t i = 0; i < string.length(); i++) {
      char& c = string[i];  // reference to character inside string
      c = std::toupper(c);
    }
    

    Using range-based for, the above can be written more briefly (and executed more efficiently) as:

    for (auto& c: string)
        c = std::toupper(c);