我正在使用||
,因此如果用户输入Y
或y
,则它等于相同。示例:(option=='y' || option =='Y')
我知道有一个功能可以摆脱这种情况,以便用户在Y
或y
中输入相同的内容。
最好的方法是什么?
答案 0 :(得分:2)
您可以尝试使用https://www.tutorialspoint.com/c_standard_library/c_function_tolower.htm中所述的tolower((unsigned char)option) == 'y'
(您需要添加#include <ctype.h>
)。
或者对'Y'和'y'使用带有fallthrou情况的switch语句。
我想如果你经常有(option=='y' || option =='Y')
我认为最好的方法是用你喜欢的方式把它放到一个单独的函数中并调用函数;)
答案 1 :(得分:2)
假设option
的类型为char
,您可以替换
if (option == 'y' || option == 'Y')
通过
if (tolower((unsigned char)option) == 'y')
施展到unsigned char
是必要的。 tolower
采用int
类型的参数,其值必须在unsigned char
或等于EOF
的范围内(通常为-1
)。如果普通char
碰巧被签名(这是常见的)并且option
的值恰好是负数(如果输入异常则可能发生),那么tolower(option)
将是未定义的行为。
(是的,对演员表的需求很烦人且违反直觉。是的,tolower()
应该接受char
范围内的任何参数。是的,你仍然需要处理它。)
其他可能性:
option = tolower((unsigned char)option);
if (option == 'y') ...
或
switch (option) {
case 'y': case 'Y': ...
...
}
switch
解决方案仍针对'y'
和'Y'
进行测试,但它的详细程度较低;你不必多次提到option
。当然,您也可以在switch
上tolower((unsigned char)option)
。
答案 2 :(得分:1)
快速,尽管内存浪费的方法是使用查找表:
#include <limits.h>
#include <stdbool.h>
// Initialize all values to false, except for two.
// Note 'y', 'Y' have positive values in all encodings.
static const bool IsYory[UCHAR_MAX + 1u] = {
['y'] = 1,
['Y'] = 1,
};
char option = foo();
if (IsYory[(unsigned char) option]) {
bar();
}
无分支方法
if (((option - 'y')*(option - 'Y')) == 0) {
如果两个字母仅相差1位,例如'y'
和'Y'
使用ASCII甚至EBCDIC编码,
if ((option | ('y' ^ 'Y')) == ('y' | 'Y')) {
最好只使用toupper()
。优先toupper()
超过tolower()
以获得更多字符集,超过'A-Z,a-z'
折叠到高于字符的优先级而不是更低的字符集。对于A-Z
,它没有任何区别。
if (toupper(option) == `Y`)
答案 3 :(得分:0)
使用tolower()或toupper()函数使用户输入小写或大写的所有内容,这样您就不会遇到问题。 更多信息:Description