for loop c++ 'toupper' implementation

1.5k Views Asked by At

Can someone explain why this short code in C++ doesn't produce the expected output. The code is supposed to print the string in capital letters.

#include <iostream>
#include <string>
using namespace std;

int main(){
    string sample("hi, i like cats and dogs.");
    cout << "small: " << sample << endl << "BIG  : ";

    for(char c: sample)
        cout << toupper(c);
    cout<<endl;

return 0;
}

The output of the above program is:

small: hi, i like cats and dogs.
BIG  : 72734432733276737569326765848332657868326879718346

but I expected:

small: hi, i like cats and dogs.
BIG  : HI, I LIKE CATS AND DOGS.

I've only programmed in python.

3

There are 3 best solutions below

2
On BEST ANSWER

toupper returns int. You need to cast the return value to char such that the output stream operator << prints out the character and not its numeric value.

You should also cast the input to unsigned char, to cover the case where char is signed and your character set includes negative numbers (this would invoke undefined behaviour in toupper). For example,

cout << static_cast<char>(toupper(static_cast<unsigned char>(c)));

Note that you need to include the relevant header (cctype if you want std::toupper or ctype.h if you want C's toupper.)

0
On

It's printing the ASCII values which are integers. I agree with @Captain Obvlious.

0
On
#include <iostream>
#include <string>
using namespace std;

int main(){
    string sample("hi, i like cats and dogs.");
    cout << "small: " << sample << endl << "BIG  : ";

    for(char c: sample)
        cout << (char)toupper(c);
    cout<<endl;

return 0;
}

// toupper() return integer value