如果有陈述,有什么方法可以缩短此时间吗?

时间:2019-08-16 19:56:20

标签: c if-statement char logical-operators

我有这么大的if语句,它看起来不那么令人愉悦,而且效率也不高。

我正在制作一个程序(取决于用户输入的内容)运行某个代码块,例如,如果用户输入import "./settings/mainSettingsPage"; ,则该程序运行的代码会向文件中添加一些内容,等等。这样的方式是在do-while语句中(虽然我不知道这是否相关)。

'a'

如您所见,这是一个很长的if语句,我希望它要短一些。谢谢

5 个答案:

答案 0 :(得分:8)

嗯,这是个例子,

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

else if (strchr("aArRsSeE", ansr) == NULL)
{
    printf("Invalid input!\n");
}

答案 1 :(得分:4)

我会选择:

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的行为是不确定的。

答案 2 :(得分:2)

为回答您的问题,我将亲自使用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;
}

答案 3 :(得分:1)

取决于ansr的大小写是否重要,在if语句之前转换为小写将占所需检查量的一半。

答案 4 :(得分:1)

您似乎正在尝试编写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;
}