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 answers

2
juanchopanza 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
infallible_evolution On

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

0
Raunak raj 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