Переключатель со строками
Каким-то образом мое заявление о переключении не проходит ни в одном из моих случаев, но не должно ли оно пройти в одном? (Я использую /questions/18267689/luchshij-sposob-vklyuchit-stroku-v-c/18267711#18267711 в качестве ссылки).
Нет выходных данных, после чего приложение блокируется.
#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);
}
2 ответа
Решение
- Ваш
lookuptable[]
имеет пробел после "string1", который не согласуется с другими записями. У меня такое чувство, что ты этого не хотел. - Ваш
keyfromstring()
увеличиваетсяsym
неправильно (это вызывает segfault). Заменить:
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;
}
- Положить ваши
printf("Case: nothing happen\n");
внутриdefault
,
Вы не можете сделать это таким образом. switch
работает для целых чисел (констант), и ваши строки не являются таковыми. Кроме того, посмотрите здесь, эта тема уже обсуждалась.