有没有办法可以缩短这个 if 语句?

Posted

技术标签:

【中文标题】有没有办法可以缩短这个 if 语句?【英文标题】:Is there a way I can shorten this if statment? 【发布时间】:2019-12-23 02:53:36 【问题描述】:

我有这个非常大的 if 语句,它看起来不顺眼,也没有尽可能高效。

我正在制作一个程序(取决于用户输入)运行某个代码块,例如,如果用户输入'a',程序运行的代码会向文件中添加一些内容等。顺便说一下在 do-while 语句中(我不知道这是否相关)。

else if(ansr != 'a' && ansr != 'A' && ansr != 'r' && ansr != 'R' && ansr != 's' && ansr != 'S' && ansr != 'e' && ansr != 'E')

    printf("Invalid input!\n");

如您所见,这是一个非常长的 if 语句,我希望它更短。谢谢

【问题讨论】:

习惯上一次询问一种语言。 C 还是 C++? c,我认为它们已经足够接近了。很抱歉造成混乱。 既然这是else if,我假设您正在处理上述if,else if 语句中的那些不同字符?为什么不使用简单的else 来捕获无效的输入? 当我使用else 时,无论如何它都会打印Invalid Input 你能发布完整的if,else if 逻辑吗? 【参考方案1】:

嗯,什么例子,随便。

为什么不使用strchrstrchr 返回指向字符串中字符的指针(如果找到),否则返回 NULL。

else if (strchr("aArRsSeE", ansr) == NULL)

    printf("Invalid input!\n");

【讨论】:

这样一个不幸的字符串。 如果再重新排序会更有趣。 您能解释一下strchr 的作用和工作原理吗?谢谢。【参考方案2】:

我会选择:

switch(tolower(ansr)) 
case 'a':
case 'r':
case 's':
case 'e':
    do_stuff();
    break;
/* other cases here */

或者你可以使用更多的库函数,例如:

if (strchr("ares", tolower(ansr)) 
    do_stuff();

strchr 函数在给定字符串中搜索给定字符,如果不存在则返回NULL(或指向它第一次出现的指针,但这不是我们在这里感兴趣的用例)

这是假设ansrunsigned charEOF 的范围内。否则tolower 的行为是未定义的。

【讨论】:

使用tolower((unsigned char)ansr),否则很容易得到UB。 即使是char,如果它是负数,你也会得到UB(和!= EOF)。 @EugeneSh。是的,它是一个字符,你能解释一下strchr 是做什么的吗?【参考方案3】:

为了回答您的问题,我个人会使用switch statement。它易于使用且易于阅读。使您的代码更具可读性的另一件事是使用toupper。 这是一个例子:

#include <stdio.h>
#include <ctype.h>

int main ()

    char inp = 'i';
    char ansr = toupper(inp);
    switch(ansr) 
        case 'A' :
            // Do something
            break;
        case 'R' :
            // Do something
            break;
        case 'S' :
            // Do something
            break;
        case 'E' :
            // Do something
            break;
        default :
            printf("Invalid input!\n");
    
    return 0;

【讨论】:

【参考方案4】:

您似乎正在尝试编写else if 案例来捕获您支持的输入字符。 else 案例非常适合这种情况:

...
char input;
//get your input
if (input == 'A' || input == 'a')
    DoA();
else if (input == 'R' || input == 'r')
    DoR();
else if (input == 'S' || input == 's')
    DoS();
else if (input == 'E' || input == 'e')
    DoE();
else
    DoInvalidInput();

或者,如果您使用 tolower(),您可以将其放在 switch 语句中:

char lowerChar = tolower((unsigned char)input);
switch (lowerChar)

    case 'a': DoA(); break;
    case 'r': DoR(); break;
    case 's': DoS(); break;
    case 'e': DoE(); break;
    default: DoInvalidInput(); break;

【讨论】:

【参考方案5】:

根据 ansr 的大小写是否重要,在 if 语句之前转换为小写将减少所需检查量的一半。

【讨论】:

你能解释一下你是怎么做到的吗? tolower() 的原型是 int tolower(int c);,所以为了确保避免未定义的行为,您必须传递 tolower() 一个 无符号 char 值。

以上是关于有没有办法可以缩短这个 if 语句?的主要内容,如果未能解决你的问题,请参考以下文章

python if语句太长太丑,有没有办法缩短它[重复]

缩短多余的 switch 语句

有没有办法缩短我的代码?

有没有办法在 VB.Net 中突出显示 If - End If 语句

IntelliJ 的搜索模板语言是不是有办法识别没有被 if 语句包装的函数调用

有没有办法根据之前是不是在另一个视图控制器上按下按钮来编写 if 语句?