Функция преобразования символов std :: isupper () & std :: islower () C ++ 17 - PullRequest
6 голосов
/ 12 февраля 2020

Я создал простую программу, чтобы проверить, является ли введенная пользователем буква прописной или строчной, а затем преобразовать строчные в прописные и строчные в строчные, используя функцию std::isupper() и std::islower(). после запуска кода я получаю символьную форму в числовой форме вместо ожидаемого эквивалента в верхнем / нижнем регистре. Почему это так?

#include <iostream>

int main()
{
    char letter {};

    std::cout << "Enter a letter:";

    std::cin >> letter;

    if (std::isupper(letter))
    {
        std::cout << "You entered an uppercase letter"
                     "\n"
                     "the lowercase equivalent is:"
                  << std::tolower(letter);
    }

    if (std::islower(letter))    
    {
        std::cout << "You entered a lowercase letter"
                     "\n"
                     "the uppercase equivalent is:"
                  << std::toupper(letter);
    }

    return 0;
}

Вот пример вывода ниже:

Enter a letter:F
You entered an uppercase letter.
The lowercase equivalent is:102

Enter a letter:f
You entered a lowercase letter.
The uppercase equivalent is:70

Ответы [ 3 ]

9 голосов
/ 12 февраля 2020

std::tolower и std::toupper возврат int, а не char ( из-за его унаследованного происхождения от C существуют определенные требования, из-за которых был выбран int, см. Сноску ).

Вы можете привести его обратно к типу char, чтобы получить ожидаемые результаты:

static_cast<char>(std::tolower(letter));

Или вы можете сохранить результат в переменной char раньше (если вам нужно преобразовать ее в другом месте) ):

letter = std::tolower(letter);
std::cout << letter;

Примечание: Как заметил Петр в комментарии, существуют требования к std::tolower и std::toupper, которые требуют использования типа больше, чем тип, который фактически необходим , Цитируя это ниже:

Они также определены как способные принимать и возвращать EOF - значение, которое не может быть представлено как символ, но может быть представлено как int. Iostreams C ++ (конечно, не наследники от C, являющиеся специализациями шаблонного std::basic_istream), имеют функцию get() без аргументов, которая читает символ из потока и возвращает целочисленный тип, больший, чем читаемый тип символа. Это часть механизма, позволяющего прочитать один символ из файла и справиться с ошибочными условиями.

2 голосов
/ 12 февраля 2020

1. option

Вы можете использовать std::tolower и std::toupper из заголовка <locale>, которые возвращают тип, который вы ожидаете, что они возвратят .

Посмотрите на примеры:

char c {'T'};
std::cout << std::tolower(c, std::locale()) << std::endl; // output: t

и

char c {'t'};
std::cout << std::toupper(c, std::locale()) << std::endl; // output: T

Проверка живой пример

2. опция

Вы можете использовать std::tolower и std::toupper из <cctype> заголовок, который возвращает int, что вам нужно бросить char.

Вот примеры:

char c {'T'};
std::cout << static_cast<char>(std::tolower(c)) << std::endl; // output: t

и

char c {'t'};
std::cout << static_cast<char>(std::toupper(c)) << std::endl; // output: T

Чек живой пример

Вы также можете создавать свои собственные удобные вспомогательные функции:

char toupper(char c) {
    return static_cast<char>(std::toupper(static_cast<unsigned char>(c)));
}

char tolower(char c) {
    return static_cast<char>(std::tolower(static_cast<unsigned char>(c)));
}

, которые вы можете использовать следующим образом:

char c1 {'T'};
char c2 {'t'};
std::cout << tolower(c1) << std::endl; // output: t
std::cout << toupper(c2) << std::endl; // output: T
0 голосов
/ 12 февраля 2020
if(std::isupper(letter))
{

  std::cout<<"You entered an uppercase letter"<<"\n"

  "the lowercase equivalent is:" << (char)std::tolower(letter);
}

if (std::islower(letter))

{

  std::cout<<"You entered a lowercase letter"<<"\n"

  "the uppercase equivalent is:" << (char)std::toupper(letter);

}

    return 0;

}
...