Почему я получаю число, когда я передаю результат tolower () в std :: cout, а не когда использую putchar ()?

Я пытался написать программу, которая будет преобразовывать каждое слово (в верхнем или нижнем регистре) в верхний или нижний регистр (в зависимости от того, какой регистр является максимальным). Так вот моя программа

#include<iostream>
#include<cstring>
#include<cctype>
#include<cstdio>
using namespace std;
int main()
{
char s[101];
int c=0, sm=0, i;

cin>>s;

for(i=0;i<strlen(s);i++)
{
if(s[i]>='A' && s[i]<='Z')
c++;
else
sm++;
}

if(sm>c)
{
for(i=0;i<strlen(s);i++)
{
//cout<<tolower(s[i])<<endl;
putchar(tolower(s[i]));
}
}
else
{
for(i=0;i<strlen(s);i++)
{
//cout<<toupper(s[i])<<endl;
putchar(toupper(s[i]));
}
}
}

Но я был удивлен, увидев, что если я напишу эти заявления

if(sm>c)
{
for(i=0;i<strlen(s);i++)
{
cout<<tolower(s[i])<<endl;
}
}

или же

else
{
for(i=0;i<strlen(s);i++)
{
//cout<<toupper(s[i])<<endl;
putchar(toupper(s[i]));
}
}

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

1

Решение

std::tolower() а также std::toupper() Возвращаемое значение функции int. А также std::cout напечатайте точное значение, которое появляется к нему.

Так cout<< tolower(s[i])<<endl вывести ASCII значение символов. Но когда ты пишешь putchar(toupper(s[i])) затем putchar() Функция автоматически преобразует значение ASCII в символы. Вот почему вы получаете характер в качестве вывода.

Для того, чтобы использовать cout<< tolower(s[i]) << endl вам нужно типизировать значение ASCII к символу.

Так что пиши —

cout<< (char)(toupper[i]) <<endl;
cout<< (char)(tolower[i]) <<endl;
2

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

Причиной этого является tolower(), Тип возврата tolower() это инт.

Это означает, что это эквивалентно печати целого числа, а не символа.

Если вы хотите показать это правильно, используйте это:

cout << static_cast<char>(tolower(s[i])) << "\n";
3

Просто чтобы добавить, что это ложное сравнение.

С ++ эквивалент putchar является ostream::put, как это:

std::cout.put(std::tolower(s[i]));

Потому что и это и putchar взять charвыполняется неявное преобразование. Это необходимо, потому что tolower дает вам int (по историческим причинам, вроде).

Оператор потоковой передачи << имеет гораздо более общий характер и имеет перегрузки для всех видов типов, так что он может форматировать ваши данные для вас. Так как вы даете это intи не особо просят charчисло — это то, что вы получаете.

2

Из ссылки cplusplus.com для tolower:

Значение возвращается как значение типа int, которое может быть неявно приведено к типу char.

Однако печать возвращенного int не преобразует его в символ. Вы можете явно привести его:

std::cout<< (char) tolower(s[i])<<endl;

Однако статическое приведение безопаснее:

std::cout << static_cast<char>(tolower(s[i]));
1

В этом случае:

if(sm>c)
{
for(i=0;i<strlen(s);i++)
{
cout<<tolower(s[i])<<endl;
}
}

да, вы должны ожидать значение ASCII. Это потому, что tolower — это функция, которая возвращает целое число, а cout выводит непосредственно то, что ей дано, она не выполняет никаких манипуляций.

Однако вы сказали, что в этом случае:

else
{
for(i=0;i<strlen(s);i++)
{
//cout<<toupper(s[i])<<endl;
putchar(toupper(s[i]));
}
}

Вы также получаете значение ASCII, но я думаю, что вы ошиблись. Это должно вывести символ, потому что функция putchar () не только выводит то, что ему дано, но и заранее выполняет манипуляции, чтобы убедиться, что он в формате char.

0

cout печатает значение, а в C ++ tolower возвращает int (ASCII), так что вы получите следующее: если вы хотите выкрикнуть реальный символ, вам нужно вручную преобразовать вывод.

cout<<static_cast<char>((s[i]))<<endl;

Онлайн редактор для C ++ (пример)

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