有没有办法可以缩短这个 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】:
嗯,什么例子,随便。
为什么不使用strchr
? strchr
返回指向字符串中字符的指针(如果找到),否则返回 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
(或指向它第一次出现的指针,但这不是我们在这里感兴趣的用例)
ansr
在unsigned char
或EOF
的范围内。否则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 语句?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在 VB.Net 中突出显示 If - End If 语句