2012-10-13 2 views
2

저는 게임을하고 있는데 코드를 실행하고 "case label이 정수 상수로 줄어들지 않습니다"라는 오류가 나타납니다. 나는 이것이 무엇을 의미하는지 알 것 같지만 어떻게 고칠 수 있습니까? 내가 할 수있는 사용자가 옵션 중 하나의 유형 원하고, 그에 해당하는 조치를 할 것을 그래서케이스 레이블이 C에서 정수 상수로 축소되지 않습니까?

#include<stdio.h> 
#include<stdlib.h 

int player_cash[3] = {50}; 
char job[][20] { 
    'A', 
    'B', 
    'C', 
    "Donate", 
    "Go to work", 
    "Exit" 
}; 
int jobs; 

int main() 
{ 
    while(player_cash[0] > 0) { 
     printf("Please type A, B, C, Donate, Go to work, or Exit\n"); 
     switch(jobs) { 

      case 'A': 
      player_cash[0]-=5; 
      player_cash[1]+=5; 
      printf("Cash=%i\n\n", player_cash[0]); 
      continue; 

      case 'B': 
      player_cash[0]-=5; 
      player_cash[2]+=5; 
      printf("Cash=%i\n\n", player_cash[0]); 
      continue; 

      case 'C': 
      player_cash[0]-=5; 
      player_cash[3]+=5; 
      printf("Cash=%i\n\n", player_cash[0]); 
      continue; 

      case "Donate": 
      player_cash[0]-=15; //Error here 
      player_cash[1]+=5; 
      player_cash[2]+=5; 
      player_cash[3]+=5; 
      printf("Cash donated\n\n"); 
      printf("Cash=%i\n\n", player_cash[0]); 
      continue; 

      case "Go to work": 
      player_cash[0]+=10; //Error here 
      printf("Work done\n\n"); 
      printf("Cash=%i\n\n", player_cash[0]); 
      continue; 

      case "Exit": 
      printf("Thanks for playing!\n\n"); //Error here 
      break; 

      default: 
      printf("Does not compute"); 
      continue; 
     } 
    } 
     getchar(); 
     return 0; 
} 

: 여기 내 코드입니다. 이 문제를 어떻게 해결할 수 있습니까?

답변

1

사례 레이블 중 일부는 문자 (char 유형, 's로 표시)입니다. 그 정수 상수입니다.

다른 레이블은 유효한 유형 const char * 인 문자열 리터럴 ("으로 표시)입니다. 해당 정수가 아니며 이런 식으로 사용할 수 없습니다. 그들은 종종 char * 것처럼 사용할 수 있지만이를 변경하려고하지 않는 역사적 이유로


1 . 그렇지 않으면.

7

당신은 case 식으로 문자열을 사용할 수 없습니다

case "Donate": 

만 필수 표현을 사용할 수 있습니다, 그래서 예를 들면, case 'A':은 정상입니다.

문제가 있습니다. jobsint이며 문자열을 테스트하고 있습니다. 사용자가 문자열 (한 문자 이상)을 입력 할 수있게하려면 문자열 변수를 유지하고 완전한 입력 행을 얻으려면 fgets과 같은 것을 사용해야합니다.

+0

어떻게 해결할 수 있습니까? –

+0

@Brandon, 당신은'strcmp'와 결합 된'if' 문을 사용할 수 있습니다. 프로그램에는 다른 많은 오류가 있습니다. 예를 들어, 실제로는 입력을 읽지 않습니다. –

+0

@Brandon :'if (strcmp (jobs, constant_1)) ... else if ... ' – Vlad

1

문자열을 c와 비교할 수 없습니다. "hello" == "hello"은 의도대로 작동하지 않습니다. 스위치는 기본 유형에 대해서만 간단한 c 비교를 수행합니다.

switch(jobs) { 

     case 'A': 
     player_cash[0]-=5; 
     player_cash[1]+=5; 
     printf("Cash=%i\n\n", player_cash[0]); 
     continue; 

     case 'B': 
     player_cash[0]-=5; 
     player_cash[2]+=5; 
     printf("Cash=%i\n\n", player_cash[0]); 
     continue; 

     case 'C': 
     player_cash[0]-=5; 
     player_cash[3]+=5; 
     printf("Cash=%i\n\n", player_cash[0]); 
     continue; 

     case 'D': 
     player_cash[0]-=15; //Error here 
     player_cash[1]+=5; 
     player_cash[2]+=5; 
     player_cash[3]+=5; 
     printf("Cash donated\n\n"); 
     printf("Cash=%i\n\n", player_cash[0]); 
     continue; 

     case 'G': 
     player_cash[0]+=10; //Error here 
     printf("Work done\n\n"); 
     printf("Cash=%i\n\n", player_cash[0]); 
     continue; 

     case 'E': 
     printf("Thanks for playing!\n\n"); //Error here 
     break; 

     default: 
     printf("Does not compute"); 
     continue; 
    } 

getch()의 문자 만 읽으면이 값을 비교할 수 있습니다.

1
  1. 당신의 임무 배열했다 일관성이 초기화 (혼합 (그는 입력 "기부"있기 때문에 등, O를 읽을 다음, 의지가 먼저 D, 수익을 읽기), getch를 (만 입력 한 문자로 사용자에게 문의) charconst char *)

  2. char 포인터는 컴파일시 상수가 아니므로 문자열 리터럴을 대소 문자 레이블로 사용할 수 없습니다.사용 정수 : 또한

    enum jobType 
    { 
        jobA, 
        jobB, 
        jobC, 
        jobDonate, 
        jobGoToWork, 
        jobExit, 
        /* marker */ 
        jobInvalid 
    }; 
    
    enum jobType typeOfJob(const char* const name) 
    { 
        int i; 
        for (i=jobA; i!=jobInvalid; ++i) 
         if (0 == strcmp(jobNames[i], name)) 
          return i; 
        return i; 
    } 
    
  3. 에서, player_cash 1 개 요소 짧았다 (및 인덱스 범위에서 작성되었다 [3])


코드 샘플도하는 방법을 보여줍니다 일반적으로 gets 피하기, 몇 가지 기본적인 라인 끝 잘라 내기 및 대충 소문 내기 비교 (Windows의 경우 stricmp, IIRC) http://liveworkspace.org/code/227015a4e51126d55ca4eb1eea739b02

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

int player_cash[4] = {50}; 

enum jobType 
{ 
    jobA, 
    jobB, 
    jobC, 
    jobDonate, 
    jobGoToWork, 
    jobExit, 
    /* marker */ 
    jobInvalid 
}; 

const char jobNames[][20] = 
{ 
    "A", 
    "B", 
    "C", 
    "Donate", 
    "Go to work", 
    "Exit" 
}; 

enum jobType typeOfJob(const char* const name) 
{ 
    int i; 
    for (i=jobA; i!=jobInvalid; ++i) 
#ifdef CASE_SENSITIVE 
     if (0 == strcmp(jobNames[i], name)) 
#else 
     if (0 == strcasecmp(jobNames[i], name)) 
#endif 
      return i; 
    return i; 
} 

const char* safer_gets() 
{ 
    static char input[1024]; 
    char *p; 
    const char* t; 
    const char trimAt[] = "\r\n\t "; 
    fgets(input, sizeof(input), stdin); 

    for (t=trimAt; *t; ++t) 
     while(p = strrchr(input, *t)) 
      *p = 0; 

    return input; 
} 

int main() 
{ 
    const char* input; 
    while(player_cash[0] > 0) 
    { 
     printf("Please type A, B, C, Donate, Go to work, or Exit\n"); 
     input = safer_gets(); 

     switch(typeOfJob(input)) 
     { 
     case jobA: 
      player_cash[0]-=5; 
      player_cash[1]+=5; 
      printf("Cash=%i\n\n", player_cash[0]); 
      continue; 
     case jobB: 
      player_cash[0]-=5; 
      player_cash[2]+=5; 
      printf("Cash=%i\n\n", player_cash[0]); 
      continue; 
     case jobC: 
      player_cash[0]-=5; 
      player_cash[3]+=5; 
      printf("Cash=%i\n\n", player_cash[0]); 
      continue; 
     case jobDonate: 
      player_cash[0]-=15; 
      player_cash[1]+=5; 
      player_cash[2]+=5; 
      player_cash[3]+=5; 
      printf("Cash donated\n\n"); 
      printf("Cash=%i\n\n", player_cash[0]); 
      continue; 
     case jobGoToWork: 
      player_cash[0]+=10; 
      printf("Work done\n\n"); 
      printf("Cash=%i\n\n", player_cash[0]); 
      continue; 
     case jobExit: 
      printf("Thanks for playing!\n\n"); 
      break; 
     default: 
      printf("Does not compute"); 
      continue; 
     } 
    } 
    getchar(); 
    return 0; 
} 
관련 문제