Как я могу превратить cin в нижний регистр с этим кодом? - PullRequest
0 голосов
/ 19 октября 2019

Я делаю текстовую игру и хочу, чтобы у моих опций был общий определитель. Который работает. Но я хочу, чтобы std::cin >> choice; всегда был в нижнем регистре, чтобы ошибка в верхнем регистре не имела значения для игрока. Не удается найти ответы.

cpp file:

std::cout << std::endl << "Choise:";
std::cin >> choice;

if (dLookAround)
{
    std::cout << "ede" << std::endl; //just a test
}

headerfile:

private:
std::string choice;

#define dLookAround \
    (choice == "Look around"\
    || choice == "What do i see?"\
    || choice == "What do i see"\
    || choice == "Explore"\
    || choice == "Scout")

В этом состоянии код работает. Но я хочу, чтобы cin читал выбор в нижнем регистре, чтобы мне не нужно было писать каждое слово в верхнем и нижнем регистре в #define все время.

Ответы [ 2 ]

1 голос
/ 19 октября 2019

Я бы просто использовал сравнение без учета регистра, например strcmpi() или эквивалентное, вместо преобразования входных данных, например:

#define dLookAround ( \
    (strcmpi(choice.c_str(), "Look around") == 0) || \
    (strcmpi(choice.c_str(), "What do i see?") == 0) || \
    (strcmpi(choice.c_str(), "What do i see") == 0) || \
    (strcmpi(choice.c_str(), "Explore") == 0) || \
    (strcmpi(choice.c_str(), "Scout") == 0) \
    )
1 голос
/ 19 октября 2019

Вы можете просто преобразовать choice в нижний регистр с помощью std :: transform из заголовка <algorithm> и std :: tolower из заголовка <cctype>;а также. затем протестируйте его.

Например:

std::transform( choice.begin(), choice.end(), choice.begin(),
                []( auto c ){ return std::tolower( c ); } );

Кстати, вы должны передать choice в dLookAround, чтобы сделать его более читабельным в операторе if, например:

if ( dLookAround( choice ) ) { /* ... */ }

Или с улучшенными именами, такими как isSelected и choice:

if ( isSelected( choice ) ) { /* ... */ }
...