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

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

#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

Ответы [ 6 ]

0 голосов
/ 28 декабря 2018

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

Эквивалент C ++ putchar равен ostream::put, например:

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

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

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

0 голосов
/ 28 декабря 2018

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

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 голосов
/ 28 декабря 2018

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;
0 голосов
/ 28 декабря 2018

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

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

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

0 голосов
/ 28 декабря 2018

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

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

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

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

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

std::cout << static_cast<char>(tolower(s[i]));
0 голосов
/ 28 декабря 2018

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

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

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

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