C++:检查用户输入是否为字符A、W或D之一。

3

在Python中,我可以做到:

char_choice = input("What is your character choice? Please enter A, W or   D.")
while char_choice.lower() not in ["a", "w", "d"]:
    char_choice = input("You entered an incorrect character. Please try 
    again:")

在C ++中,有没有一种方法可以重复第2行?我已经尝试了很多种方式,但它不起作用,所以我知道我做错了什么:

    char classificationCode;
    cin >> classificationCode;
    while (classificationCode != "b" || classificationCode != "B" ||     classificationCode != "d" || classificationCode != "D" || classificationCode != "w" || classificationCode != "W");
5个回答

1
您正在将一个字符与一个字符串进行比较,您尝试过:
classificationCode != 'b'

确实如此。否则,您将会检查字符串“b”的地址与字符'b'的整数值等价物进行比较。 - Richard Green
@RichardGreen 是的,我不知道自己有多少次花了一个小时去追踪一个错误,最后发现它只是一个字符串而不是字符。 - Dylan Lawrence
尽管检查字符而不是字符串是正确和重要的,在 while 循环中,其中一个答案将始终为 True,因此它将无限重复。 - Maor
@Maor 我没有检查他的整个循环,我只是指出了主要问题,即他将一个字符与一个字符串进行比较。 - Dylan Lawrence
这确实有帮助。我必须小心那些双引号和单引号哈哈... - star

1

最接近Python的东西是(在C++11中):

std::unordered_set<char> valid = {'a', 'w', 'd'};
while (!valid.count(tolower(classificationCode))) {
    cout << prompt;
    cin << classificationCode;
}

尽管将该逻辑放入一个函数并只使用switch没有问题:
while (!isValidClassification(classificationCode)) {
    cout << prompt;
    cin >> classificationCode;
}

bool isValidClassification(char code) {
    switch (tolower(code)) {
    case 'a':
    case 'w':
    case 'd':
        return true;
    default:
        return false;
    }
}

在C++03中,没有unordered_set或列表初始化,因此您需要像这样声明valid:
std::set<char> valid;
valid.insert('a');
valid.insert('w');
valid.insert('d');

1
你可以使用 tolower() 函数将你的 classificationCode 字符转换为小写字母:
char lowerCode = tolower(classificationCode);

请注意,您需要首先包含“ctype.h”头文件!
之后,您应该正确设置while条件。我猜你正在一个do-while循环中执行此操作。如果您想确保用户输入“b”,“d”或“w”,则需要使用逻辑AND(&&)。然后,您在结尾处的条件应该是:
// ...
while (lowerCode != 'b' && lowerCode != 'd' && lowerCode != 'w')

1
你应该将||改为&&,或者尝试使用
while (!(classificationCode == 'b' || classificationCode == 'B' || ...))
不要忘记将""更改为'',因为classificationCode的类型是char。
如果你想要小写字母,可以尝试使用std::ctype::tolower(),包括


0
如果您想检查字符序列中是否包含某个字符,可以使用以下代码:
(std::string("awd").find(std::tolower(ch)) != std::string::npos)

当然,有许多实现这个目标的方法:使用向量代替字符串,使用C++11中的<locale>而不是C语言中的ctype等。

他并没有检查一个序列是否包含一个字符,他只是想检查一个字符是否与另一个字符相同,因此正常的!=应该可以正常工作。 - Dylan Lawrence
@DylanLawrence 但这就是 Python 中 in 的工作方式。同时,这也是避免多个 != 的 Pythonic 方式。 - myaut
啊,我明白了… 我反过来读你的代码了。这确实是Python的做法,但对于学习C++的人来说,可能不是最好的选择。 - Dylan Lawrence
@DylanLawrence,这就是 C++ 的精髓 :)。在 Python 中有一种“Pythonic”的方法来实现,还有一些不推荐使用的方法。在 C++ 中,您可以使用 != 'ch' 或 switch(见下文)或跳转表以 C 的方式完成,也可以像我建议的那样以 Python 方式完成,甚至更糟糕-通过模板元编程生成条件。 - myaut
1
"模板元编程" 魔鬼退散! - Dylan Lawrence

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接