我有以下代码:
#include <stdio.h>
#define WHITE_SPACE 0
#define NOT_WHITE_SPACE 1
void main() {
char c;
int code;
printf("Please give a character: ");
scanf("%c", &c);
if (c== " " || c== "\n" || c== "\t")
code = WHITE_SPACE;
else:
code = NOT_WHITE_SPACE;
}
printf("%d\n", code);
}
我想将if-else
语句转换为switch
。
当我尝试case " "
或case "\n"
或case "\t"
时,我得到error case label does not reduce to an integer constant
。你知道如何解决这个问题吗?
答案 0 :(得分:5)
首先,您发布的原始代码无法正常工作,它不是有效的C。
switch
语句仅适用于整数,因此必须使用适当的字符常量,例如' '
。而不是字符串文字" "
。示例:
switch(ch)
{
case ' ':
case '\n':
case '\t':
puts("whitespace");
break;
default:
puts("not whitespace");
}
话虽如此,没有必要手动推出类似的东西。 #include <ctype.h>
,然后调用函数isspace
。
答案 1 :(得分:4)
文字字符串,例如" "
实际上是(只读)字符的数组。与其他数组一样,它衰减到指向其第一个元素的指针。这意味着c == " "
将把c
中的字符与 pointer 与" "
的第一个字符进行比较。
要获取文字字符,请改为使用单引号,例如' '
:
if (c== ' ' || c== '\n' || c== '\t')
现在,当您知道如何使用文字字符时,可以在switch
标签中的case
内使用它们。
但是,当然,不要重新发明轮子,而是使用标准的isspace
函数:
if (isspace(c))