Search code examples
c++stringchar

Handling chars in string


I have followed the code example here

toupper c++ example

And implemented it in my own code as follows

void CharString::MakeUpper()
{
char* str[strlen(m_pString)];
int i=0;
str[strlen(m_pString)]=m_pString;
char* c;
while (str[i])
  {
    c=str[i];
    putchar (toupper(c));
    i++;
  }
}

But this gives me the following compiler error

CharString.cpp: In member function 'void CharString::MakeUpper()':
CharString.cpp:276: error: invalid conversion from 'char*' to 'int'
CharString.cpp:276: error:   initializing argument 1of 'int toupper(int)'
CharString.cpp: In member function 'void CharString::MakeLower()':

This is line 276

putchar (toupper(c));

I understand that toupper is looking for int as a parameter and returns an int also, is that the problem? If so how does the example work?


Solution

  • I'm going to go with the assumption that m_pString is a C style string (char *). You're doing way more fiddling than you need to be doing.

    void CharString::MakeUpper()
    {
       char* str = m_pString; // Since you're not modifying the string, there's no need to make a local copy, just get a pointer to the existing string.
       while (*str) // You can use the string pointer as an iterator over the individual chars
       {
          putchar (toupper(*str)); // Dereference the pointer to get each char.
          str++;   // Move to the next char (you can merge this into the previous line if so desired, but there's no need.
       }
    }
    

    In the example you cite, the reason it works is because of how the variables are declared.

    int main ()
    {
      int i=0;
      char str[]="Test String.\n";  // This is a compile time string literal, so it's ok to initialize the array with it.  Also, it's an array of `char`s not `char*`s.
      char c;  // Note that this is also a `char`, not a `char *`
      while (str[i])
      {
        c=str[i];
        putchar (toupper(c));
        i++;
      }
      return 0;
    }
    

    Because of the error-prone ways of using C strings, your best bet is std::string:

    void CharString::MakeUpper()
    {
       string str(m_pString);
       transform(str.begin(), str.end(), ostream_iterator<char>(cout), &toupper);
    }