【问题标题】:Is there a way I can shorten this if statment?有没有办法可以缩短这个 if 语句?
【发布时间】: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 逻辑吗?

标签: c if-statement char logical-operators


【解决方案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 值。
      猜你喜欢
      • 2020-11-17
      • 1970-01-01
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多