2013-03-08 2 views
0

어떻게 든 내 switch 문은 내 경우를 거치지 않지만 하나만 들어가면 안됩니까? (참고로 https://stackoverflow.com/a/4014981/960086을 사용하고 있습니다).문자열 스위치

출력이없고 응용 프로그램이 차단되었습니다.

#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

'x'의 값은 무엇입니까? –

+2

그 모든 부적합한 대괄호로 컴파일해서는 안됩니다. 하나에 들어갔다면'break's가없이 모두 들어갑니다. – Mike

+1

"break;"를 잊어 버렸습니다. 모든 경우에. –

답변

5
  • 는 다른 항목과 일치하지 이다 "문자열 1"후 공간이 마련되어 있습니다. 네가 이걸 원하지 않는다는 느낌이 들었어.
  • keyfromstring()이 으로 증가하고 있습니다 (이로 인해 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 돌며을 넣습니다.
+0

전화하세요. segfault가 어디에서 왔는지 파악하려고했지만 증분이 그럴 것이라고 생각하지 않았습니다. – jonhopkins

+0

이러한 실수를 수정하고 이러한 코드 (정확히) 만있는 새 프로그램을 만들었습니다. 여전히 프로그램이 충돌하지만 keyfromstring (결과를 찾을 수 있어야 함)의 첫 번째 루프 이후에 충돌이 발생하는 것을보기가 더 쉽습니다.정확한 코드를 원래 질문으로 복사하기. – Juan

+1

@Juan, 디버거를 사용하여 충돌이 발생한 곳을 확인 했습니까? 이러한 변경으로 인해 코드가 올바르게 작동하기 때문입니다. –

-3

당신은 그렇게 할 수 없습니다. switch은 정수 (상수)에서 작동하며 문자열은 그 중 하나가 아닙니다. 게다가, here을보십시오.이 주제는 이미 논의되었습니다. 귀하의 lookuptable[]

+1

그는 정수를 사용하고 있습니다. –

+0

아니요, 그는 기본도 사용하지 않습니다! 't_symstruct'와 그의 배열을보십시오. –

관련 문제