摆脱||或者在C编程中

时间:2016-10-11 16:20:05

标签: c

我正在使用||,因此如果用户输入Yy,则它等于相同。示例:(option=='y' || option =='Y')我知道有一个功能可以摆脱这种情况,以便用户在Yy中输入相同的内容。

最好的方法是什么?

4 个答案:

答案 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。当然,您也可以在switchtolower((unsigned char)option)

答案 2 :(得分:1)

  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();
    }
    
  2. 无分支方法

    if (((option - 'y')*(option - 'Y')) == 0) {
    
  3. 如果两个字母仅相差1位,例如'y''Y'使用ASCII甚至EBCDIC编码,

    if ((option | ('y' ^ 'Y')) == ('y' | 'Y'))  {
    
  4. 最好只使用toupper()。优先toupper()超过tolower()以获得更多字符集,超过'A-Z,a-z'折叠到高于字符的优先级而不是更低的字符集。对于A-Z,它没有任何区别。

    if (toupper(option) == `Y`)
    

答案 3 :(得分:0)

使用tolower()或toupper()函数使用户输入小写或大写的所有内容,这样您就不会遇到问题。 更多信息:Description