C 中的 Switch 语句并不像其他语言(例如 Java 7 或 Go)中的那样智能,您不能切换字符串(也不能将字符串与==
)。开关只能在积分型上操作(int
, char
, etc).
在您的代码中,您可以使用以下命令调用 switch:switch(name[20])
。这意味着switch(*(name + 20))
。换句话说,21号开关char
名义上(因为name[0]
是第一个)。作为name
只有 20 个字符,您可以访问名称后面的任何内存。 (这可能会造成不可预测的事情)
还有字符串"kevin"
被编译为char[N]
(where N
is strlen("kevin") + 1
) 其中包含字符串。当你这样做时case "kevin"
。仅当名称位于存储字符串的同一块内存中时,它才有效。所以即使我复制了kevin
成名。它仍然不匹配,因为它存储在不同的内存中。
为了做你似乎正在尝试的事情,你会这样做:
#include <string.h>
...
if (strcmp(name, "kevin") == 0) {
...
}
字符串比较 (strcmp
) 根据字符串的差异返回不同的值。例如:
int ord = strcmp(str1, str2);
if (ord < 0)
printf("str1 is before str2 alphabetically\n");
else if (ord == 0)
printf("str1 is the same as str2\n");
else if (ord > 0)
printf("str1 is after str2 alphabetically\n");
旁注:不要使用scanf("%s", name)
以那种形式。它创建了一个常见的安全问题 use fgets
像这样:(有一种安全的方法可以使用scanf
too)
#define MAX_LEN 20
int main() {
char name[MAX_LEN];
fgets(name, MAX_LEN, stdin);
...