user3697625
user3697625

Reputation: 187

for loop c++ 'toupper' implementation

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.

Upvotes: 1

Views: 1573

Answers (3)

Raunak raj
Raunak raj

Reputation: 1

#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

Upvotes: 0

juanchopanza
juanchopanza

Reputation: 227468

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

Upvotes: 8

infallible_evolution
infallible_evolution

Reputation: 23

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

Upvotes: 0

Related Questions