2014-03-04 2 views
0

열거 형 변수를 "오늘"열거 형 변수에 어떻게 가져올 수 있는지, 그리고 주어진 예제 에서처럼 열거 형 변수를 초기화하지 않고 어떻게 할 수 있는지 궁금합니다. 문자열 배열에 scanf를 사용해야하고 오늘 = 문자열 배열을 사용해야합니까?사용자로부터 열거 형 값 가져 오기

#include <stdio.h> 
enum week{ sunday, monday, tuesday, wednesday, thursday, friday, saturday}; 
int main(){ 
enum week today; 
today=wednesday; 
printf("%d day",today+1); 
return 0; 
} 

답변

0

예 다소 차이가 있습니다. 열거 형은 내부적으로 int로 표시되고 열거 형의 이름은 컴파일하는 동안 손실됩니다. 당신이 자신을 당신이

const char *days[] = 
{ 
    "sunday", "monday", "tuesday", "wednesday", ... 
} ; 

같은 문자열 배열이 있어야 일의 이름을 보존하고 변환을 수행하려면

여러분의 프로그램은

4 day 

를 인쇄합니다. 예를 들어 :

printf ("The day is %s", days[monday]) ; 

The day is monday 
1

이 일반 enum 불가능 인쇄됩니다. 전형적인 트릭은 열거 형과 동일한 순서로 이름을 저장하는 array of const char*으로 열거 형을 보강하는 것입니다. 그런 다음 배열에 대한 인덱스로 enum 값을 사용하여 해당 string 값을 검색 할 수 있습니다.

// enum to string 
printf("%s\n", week_str[MONDAY]); 
// string to enum 
const char* input = "tuesday"; // get this from scanf or something 
size_t length = strlen(input); 
int i; 
int found = -1; 
for (i = 0; i <= WEDNESDAY; i++) { 
    if(strncmp(input, week_str[i], length) == 0) { 
    found = i; 
    break; 
    } 
} 
printf("Found: %i", found); 
0

나는 그렇게 할 것 :

#include <stdio.h> 
#include <ctype.h> 

enum week{ sunday, monday, tuesday, wednesday, thursday, friday, saturday }; 

char * EnumToString(int day) { 
    switch (day) { 
     case sunday: return "sunday"; 
     case monday: return "monday"; 
     case tuesday: return "tuesday"; 
     case wednesday: return "wednesay"; 
     case thursday: return "thursday"; 
     case friday: default: return "friday"; 
    } 
} 

enum week StringToEnum(char * day) { 

    // To not be case sensitive 
    for(int i = 0; str[i]; i++){ 
     day[i] = tolower(day[i]); 
    } 
    switch (day) { 
     case "sunday": return sunday; 
     case "monday": return monday; 
     case "tuesday": return tuesday; 
     case "wednesday": return wednesay; 
     case "thursday": return thursday; 
     case "friday": default: return friday; 
    } 
} 

int main(){ 
    enum week today; 
    today=wednesday; 
    printf("%dth day is %s",today+1, EnumToString(today+1)); 
    return 0; 
} 

그것은 인쇄됩니다 :

4th day is thursday 
+0

를 이것은 나를 ** 많이 ** 최적화 할 수 있습니다. C 표준은'sunday'의 숫자 값이 0이고,'monday'의 값이 1이라는 식입니다. –

+0

숫자로 열거 형 값을 함수로 대체 하시겠습니까? 그러나 나중에 열거 형에서 값을 추가하거나 제거하려면 전체 함수를 다시 코딩해야합니다. – Lovy

+0

아뇨, 그게 더 나았습니다, 실제로는 똑같지 만, 오류가 발생하기 쉽고 읽기가 쉽지 않습니다. 저와 pmr의 대답을보세요, 그것이 제가 의미했던 것입니다. –

관련 문제