реализация цикла toupper для цикла c ++

Может кто-нибудь объяснить, почему этот короткий код в C ++ не дает ожидаемого результата.
Код должен печатать строку заглавными буквами.

#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;
}

Вывод вышеуказанной программы:

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

но я ожидал:

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

Я программировал только на Python.

1

Решение

toupper возвращается int, Вам нужно привести приведенное значение к char такой, что оператор выходного потока << печатает символ, а не его числовое значение.

Вы также должны привести unsigned char, чтобы покрыть случай, когда char подписан, и ваш набор символов содержит отрицательные числа (это будет вызывать неопределенное поведение в toupper). Например,

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

Обратите внимание, что вам нужно включить соответствующий заголовок (cctype если ты хочешь std::toupper или же ctype.h если ты хочешь С toupper.)

8

Другие решения

Это печать значений ASCII, которые являются целыми числами. Я согласен с @Captain Obvlious.

0

По вопросам рекламы [email protected]