C 用字符串切换
不知何故,我的switch语句在我的所有案例中都没有出现,但它不应该出现在一个案例中吗? (我正在使用作为参考) 没有输出,并且应用程序在之后被阻止C 用字符串切换,c,switch-statement,case-statement,C,Switch Statement,Case Statement,不知何故,我的switch语句在我的所有案例中都没有出现,但它不应该出现在一个案例中吗? (我正在使用作为参考) 没有输出,并且应用程序在之后被阻止 #include <stdio.h> #include <stdlib.h> #define BADKEY -1 #define string1 1 #define string2 2 #define string3 3 #define string4 4 char *x = "string1"; typedef st
#include <stdio.h>
#include <stdlib.h>
#define BADKEY -1
#define string1 1
#define string2 2
#define string3 3
#define string4 4
char *x = "string1";
typedef struct {char *key; int val; } t_symstruct;
static t_symstruct lookuptable[] = {
{ "string1", string1 }, { "string2", string2 }, { "string3", string3 }, { "string4", string4 }
};
#define NKEYS (sizeof(lookuptable)/sizeof(t_symstruct))
int keyfromstring(char *key) {
int i;
for (i=0; i < NKEYS; i++) {
t_symstruct *sym = lookuptable + i;
printf("before: \n");
if (strcmp(sym->key, key) == 0) { //creates the ERROR
printf("inside: \n");
return sym->val;
}
printf("after: \n");
}
return BADKEY;
}
void newFunction(char *uselessVariable) {
printf("keyfromstring(x): %i \n", keyfromstring(x));
switch(keyfromstring(x)) {
case string1:
printf("string1\n");
break;
case string2:
printf("string2\n");
break;
case string3:
printf("string3\n");
break;
case string4:
printf("string4\n");
break;
case BADKEY:
printf("Case: BADKEY \n");
break;
}
}
int main(int argc, char** argv) {
newFunction(line);
return (EXIT_SUCCESS);
}
#包括
#包括
#定义坏键-1
#定义字符串1
#定义string2 2
#定义string3 3
#定义字符串4
char*x=“string1”;
typedef结构{char*key;int val;}t_symstruct;
静态t_symstruct lookuptable[]={
{“string1”,string1},{“string2”,string2},{“string3”,string3},{“string4”,string4}
};
#定义NKEYS(sizeof(lookuptable)/sizeof(t_symstruct))
int keyfromstring(字符*键){
int i;
对于(i=0;ikey,key)==0){//将创建错误
printf(“内部:\n”);
返回sym->val;
}
printf(“之后:\n”);
}
返回坏键;
}
void newFunction(char*uselessVariable){
printf(“keyfromstring(x):%i\n”,keyfromstring(x));
开关(keyfromstring(x)){
案例1:
printf(“string1\n”);
打破
案例2:
printf(“string2\n”);
打破
案例3:
printf(“string3\n”);
打破
案例4:
printf(“string4\n”);
打破
案例关键:
printf(“案例:BADKEY\n”);
打破
}
}
int main(int argc,字符**argv){
新函数(行);
返回(退出成功);
}
你不能那样做<代码>开关适用于整数(常量),而字符串不是其中任何一个。另外,你看,这个话题已经讨论过了。- 您的
在“string1”后面有一个空格,它是 与其他条目不一致。我觉得你不想要这个lookuptable[]
- 您的
正在递增keyfromstring()
错误(这会导致segfault)。替换为:sym
int-keyfromstring(char*key)
{
int i;
对于(i=0;i键,键)==0)
返回sym->val;
}
返回坏键;
}
或
int-keyfromstring(char*key)
{
int i;
对于(i=0;i
- 将您的
printf(“Case:nothing-course\n”)代码>在
默认值中
break
s如果它进入了一个,那么它应该会进入所有这些。在所有情况下,您都忘记了“break;”。不知道它是否有助于解决整个问题,但是您的printf(“Case:nothing\n”)
是不可访问的代码,这就是为什么在其余案例失败时不执行它的原因。您应该将其放在默认值的
情况下。检查keyfromstring(x)
的返回值(将其从开关中取出)。看起来它没有返回匹配的值,并且您没有默认的大小写。不,他甚至没有使用原语!看看t\u symstruct
和他的数组。打得好。我试图找出segfault是从哪里来的,但不认为它是增量。纠正了这些错误,并创建了一个新的程序,只使用这些代码(准确地说)。程序仍然会崩溃,但更容易看到它在第一次循环keyfromstring(它应该在那里找到结果)后崩溃。将精确的代码复制到原始问题。@Juan,您是否使用调试器查看它在哪里崩溃?因为有了这些更改,您的代码对我来说运行得很好。@AnishRam我对C有点陌生,我正在使用netbeans。使用调试器,它说我有一个SIGSEGV(分段错误),然后弹出一个错误:没有寄存器。我还得到一个警告,keyfromstrings在没有强制转换的情况下从整数生成指针。我编辑了目前正在运行的代码,通过打印的低级调试,我认为错误一定在这里“如果(strcmp(sym->key,key)==0){//创建了错误”
int keyfromstring(char *key)
{
int i;
for (i=0; i < NKEYS; i++) {
t_symstruct *sym = lookuptable + i;
if (strcmp(sym->key, key) == 0)
return sym->val;
}
return BADKEY;
}
int keyfromstring(char *key)
{
int i;
for (i=0; i < NKEYS; i++) {
if (strcmp(lookuptable[i].key, key) == 0)
return lookuptable[i].val;
}
return BADKEY;
}