我正在制作文字游戏,希望我的选项具有通用的定义器。哪个有效。但是我希望std::cin >> choice;
始终为小写字母,以便大写的拼写错误对玩家而言无关紧要。找不到任何答案。
cpp文件:
std::cout << std::endl << "Choise:";
std::cin >> choice;
if (dLookAround)
{
std::cout << "ede" << std::endl; //just a test
}
头文件:
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
中每个单词都使用大写和小写字母。
您可以简单地使用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 ) ) { /* ... */ }
我只使用不区分大小写的比较,例如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) \
)