我想从控制台读取字符,并检查它是否为字母数字。据我了解,isalnum
具有以下功能签名。
int isalnum(int x);
为什么写非法
switch(input) {
case isalnum(input):
...
如果isalnum
返回一个整数值。
答案 0 :(得分:4)
请参见https://en.cppreference.com/w/c/language/switch
语法要求
案例 constant_expression : 声明
使用
constant_expression -与转化和积分提升后的条件类型相同的常量表达式
即语法需要常量表达式。
函数调用的结果不是常量表达式。
这就是为什么它是非法的。
答案 1 :(得分:2)
您不能在case语句中调用isalnum。尝试这样的事情:
switch(isalnum(input))
{
case 0:
//do stuff
break;
default:
//do other stuff
break;
}
答案 2 :(得分:2)
其他答案已经解释了C语法的要求,特别是每个case
值需要是一个常量表达式。我只想补充一下,您提供的示例代码在看来也有缺陷。
您写道:
switch(input) { case isalnum(input): ...
一条switch
语句将切换表达式(在这种情况下为input
与每个case
表达式进行比较,以查找匹配项。但是isalnum()
的自变量为字母数字时返回 unspecified 非零数字,否则返回零。当input == isalnum(input)
实际上是字母数字(尽管可能是字母数字)时,没有理由指望input
是正确的,而您可以肯定的是 成立0
的参数。
因此,即使C允许case
表达式为非恒定表达式,这种特定方法也不正确。
答案 3 :(得分:1)
switch 语句将程序的控制流转移到列出的 case 之一。这就是为什么您需要为 case 分配常量值的原因。它们在编译时进行评估。
答案 4 :(得分:0)
如果目的是使用switch-case语句,则可以抛弃isalnum
并为每个字母数字字符设置一堆大小写,并附带一个默认大小写。像这样:
switch(input)
{
case '0':
case '1':
case '2':
[...]
case 'z':
// do something here
break;
default:
// do something else here
break;
}