printf()를 사용하여 열거형 값을 표시할 수 있습니까?
열거형의 현재 값을 출력할 수 있는 단일 라이너가 있습니까?
끈으로 말하면 안 돼정수로 %d.
세지 않는 한:
static char* enumStrings[] = { /* filler 0's to get to the first value, */
"enum0", "enum1",
/* filler for hole in the middle: ,0 */
"enum2", "enum3", .... };
...
printf("The value is %s\n", enumStrings[thevalue]);
이것은 비트 마스크의 열거와 같은 경우에는 작동하지 않습니다.이 시점에서 해시 테이블 또는 기타 보다 정교한 데이터 구조가 필요합니다.
enum MyEnum
{ A_ENUM_VALUE=0,
B_ENUM_VALUE,
C_ENUM_VALUE
};
int main()
{
printf("My enum Value : %d\n", (int)C_ENUM_VALUE);
return 0;
}
int에 enum을 캐스팅하면 됩니다!
출력 : My enum 값 : 2
enum A { foo, bar } a;
a = foo;
printf( "%d", a ); // see comments below
저도 같은 문제가 있었어요.
색상이 있는 노드의 색상을 인쇄해야 했습니다.enum col { WHITE, GRAY, BLACK };
및 노드:typedef struct Node { col color; };
인쇄하려고 했습니다.node->color
와 함께printf("%s\n", node->color);
화면에 나온 건(null)\n
.
혼잣말로 문제를 거의 해결했다.
최종 해결책은 다음과 같습니다.
static char *enumStrings[] = {"WHITE", "GRAY", "BLACK"};
printf("%s\n", enumStrings[node->color]);
이에 대한 정답은 이미 제공되었습니다. 아니요, 열거형 이름은 지정할 수 없습니다. 값만 지정할 수 있습니다.
다만, 재미삼아 열거와 룩업 테이블을 모두 일체로 제공하고, 이름을 붙여 인쇄할 수 있는 방법을 제공합니다.
main.c:
#include "Enum.h"
CreateEnum(
EnumerationName,
ENUMValue1,
ENUMValue2,
ENUMValue3);
int main(void)
{
int i;
EnumerationName EnumInstance = ENUMValue1;
/* Prints "ENUMValue1" */
PrintEnumValue(EnumerationName, EnumInstance);
/* Prints:
* ENUMValue1
* ENUMValue2
* ENUMValue3
*/
for (i=0;i<3;i++)
{
PrintEnumValue(EnumerationName, i);
}
return 0;
}
Enum.h:
#include <stdio.h>
#include <string.h>
#ifdef NDEBUG
#define CreateEnum(name,...) \
typedef enum \
{ \
__VA_ARGS__ \
} name;
#define PrintEnumValue(name,value)
#else
#define CreateEnum(name,...) \
typedef enum \
{ \
__VA_ARGS__ \
} name; \
const char Lookup##name[] = \
#__VA_ARGS__;
#define PrintEnumValue(name, value) print_enum_value(Lookup##name, value)
void print_enum_value(const char *lookup, int value);
#endif
Enum.c
#include "Enum.h"
#ifndef NDEBUG
void print_enum_value(const char *lookup, int value)
{
char *lookup_copy;
int lookup_length;
char *pch;
lookup_length = strlen(lookup);
lookup_copy = malloc((1+lookup_length)*sizeof(char));
strcpy(lookup_copy, lookup);
pch = strtok(lookup_copy," ,");
while (pch != NULL)
{
if (value == 0)
{
printf("%s\n",pch);
break;
}
else
{
pch = strtok(NULL, " ,.-");
value--;
}
}
free(lookup_copy);
}
#endif
면책사항: 이 작업을 수행하지 마십시오.
어떤 놈이 이 게시물에서 스마트한 프리프로세서 아이디어를 생각해 냈어
구현에 따라 각 구성원의 크기가 다를 수 있으므로 열거값 인쇄가 까다로울 수 있습니다.gcc 8.4.0에서 컴파일된 예를 들어보겠습니다.
#include <stdio.h>
int main(void) {
enum option {A = 0, B = 0x100000000};
// Enumerator sizes of the same enumeration can differ
printf("sizeof(A)=%zu\n", sizeof(A)); // sizeof(A)=4
printf("sizeof(B)=%zu\n", sizeof(B)); // sizeof(B)=8
// Same output even though they have different values
printf("A=%d\n", A); // A=0
printf("B=%d\n", B); // B=0
// You should know beforehand the maximum enumerator size
printf("A=%ld\n", A); // A=0
printf("B=%ld\n", B); // B=4294967296
}
언급URL : https://stackoverflow.com/questions/2161790/can-i-display-the-value-of-an-enum-with-printf
'sourcecode' 카테고리의 다른 글
C를 사용하여 Linux에서 CPU 수를 얻는 방법 (0) | 2022.08.01 |
---|---|
비동기 Vuex 액션을 2회 실행할 경우 콜 대기 후 코드를 랜덤 순서로 실행할 수 있습니까? (0) | 2022.08.01 |
Android-sdk 설치 실패: "java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema" (0) | 2022.08.01 |
.txt 파일에 쓰시겠습니까? (0) | 2022.08.01 |
인라인 기능을 사용할 때와 사용하지 않을 때? (0) | 2022.08.01 |