(C) 我是否正确地将枚举类型转换为字符串?
(C) Am I properly converting enum type to string?
我对编码还很陌生,正在学习在线课程,几乎没有什么帮助。我正在完成一项任务,创建了一堆将在以后使用的函数。此时我还没有学到任何关于点、数组或递归的知识。我对字符串的了解几乎仅限于“printf”函数。
话虽如此,我已经得到了函数“ranking_to_string”应该如何运行的描述:
This function should convert the
hand_ranking_t enumerated value passed
in to a string that describes it.
这里的枚举类型是hand_ranking_t,它按照从STRAIGHT_FLUSH(0)到NOTHING(8)的值降序排列扑克牌。综上所述,这是我为尝试遵循我的指示而创建的函数:
const char * ranking_to_string(hand_ranking_t r) {
switch (r) {
case STRAIGHT_FLUSH: printf("STRAIGHT_FLUSH\n"); break;
case FOUR_OF_A_KIND: printf("FOUR_OF_A_KIND\n"); break;
case FULL_HOUSE: printf("FULL_HOUSE\n"); break;
case FLUSH: printf("FLUSH\n"); break;
case STRAIGHT: printf("STRAIGHT\n"); break;
case THREE_OF_A_KIND: printf("THREE_OF_A_KIND\n"); break;
case TWO_PAIR: printf("TWO_PAIR\n"); break;
case PAIR: printf("PAIR\n"); break;
case NOTHING: printf("NOTHING\n"); break;
default: printf("Invalid thing\n"); break;
}
return EXIT_SUCCESS;
}
我想知道,我在函数末尾返回 EXIT_SUCCESS (0) 是否正确?有没有另一种方法可以使用printf将输入的枚举值转换为字符串?
EXIT_SUCCESS
is a macro that will expand into an environment defined indicator to be returned from main
(or via exit
, 等等)来表示你的整个程序已经成功完成了它应该做的事情。它通常不会在这种情况之外使用。
printf
is used to send output to the stream associated with stdout
. For example, you might call printf
在您的终端中显示文本。
您的函数应该 return
the string literals,供 ranking_to_string
的调用者使用。
const char *ranking_to_string(hand_ranking_t r) {
switch (r) {
case STRAIGHT_FLUSH: return "STRAIGHT_FLUSH";
case FOUR_OF_A_KIND: return "FOUR_OF_A_KIND";
/* ... and so on ... */
default: return "Invalid thing";
}
}
示例程序:
#include <stdio.h>
typedef enum {
STRAIGHT_FLUSH,
FOUR_OF_A_KIND,
/* ... and so on ... */
} hand_ranking_t;
const char *ranking_to_string(hand_ranking_t r) {
switch (r) {
case STRAIGHT_FLUSH: return "STRAIGHT_FLUSH";
case FOUR_OF_A_KIND: return "FOUR_OF_A_KIND";
/* ... and so on ... */
default: return "Invalid thing";
}
}
int main(void) {
hand_ranking_t rank = FOUR_OF_A_KIND;
const char *rank_string = ranking_to_string(rank);
printf("My ranking is <%s>\n", rank_string);
}
输出:
My ranking is <FOUR_OF_A_KIND>
您的课程中可能没有涵盖,但可以通过使用 X-Macros 完全自动化 ranking_to_string
。此外,由于扑克牌具有价值,因此按它列出它们是有意义的。
#include <stdlib.h>
#include <stdio.h>
#define HANDS X(HIGH_CARD), X(PAIR), X(TWO_PAIR), X(THREE_OF_A_KIND), \
X(STRAIGHT), X(FLUSH), X(FULL_HOUSE), X(FOUR_OF_A_KIND), \
X(STRAIGHT_FLUSH), X(ROYAL_FLUSH)
#define X(name) name
enum hand { HANDS };
#undef X
#define X(name) #name
static const char *hand_str[] = { HANDS };
#undef X
static const size_t hand_size = sizeof hand_str / sizeof *hand_str;
int main(void) {
enum hand i, j;
for(i = 0; i < hand_size; i++) printf("%s\n", hand_str[i]);
i = FULL_HOUSE;
j = FLUSH;
printf("%s is %s than %s.\n",
hand_str[i], i < j ? "less" : "greater", hand_str[j]);
return EXIT_SUCCESS;
}
其中#
是预处理器的stringizing运算符。
我对编码还很陌生,正在学习在线课程,几乎没有什么帮助。我正在完成一项任务,创建了一堆将在以后使用的函数。此时我还没有学到任何关于点、数组或递归的知识。我对字符串的了解几乎仅限于“printf”函数。
话虽如此,我已经得到了函数“ranking_to_string”应该如何运行的描述:
This function should convert the hand_ranking_t enumerated value passed in to a string that describes it.
这里的枚举类型是hand_ranking_t,它按照从STRAIGHT_FLUSH(0)到NOTHING(8)的值降序排列扑克牌。综上所述,这是我为尝试遵循我的指示而创建的函数:
const char * ranking_to_string(hand_ranking_t r) {
switch (r) {
case STRAIGHT_FLUSH: printf("STRAIGHT_FLUSH\n"); break;
case FOUR_OF_A_KIND: printf("FOUR_OF_A_KIND\n"); break;
case FULL_HOUSE: printf("FULL_HOUSE\n"); break;
case FLUSH: printf("FLUSH\n"); break;
case STRAIGHT: printf("STRAIGHT\n"); break;
case THREE_OF_A_KIND: printf("THREE_OF_A_KIND\n"); break;
case TWO_PAIR: printf("TWO_PAIR\n"); break;
case PAIR: printf("PAIR\n"); break;
case NOTHING: printf("NOTHING\n"); break;
default: printf("Invalid thing\n"); break;
}
return EXIT_SUCCESS;
}
我想知道,我在函数末尾返回 EXIT_SUCCESS (0) 是否正确?有没有另一种方法可以使用printf将输入的枚举值转换为字符串?
EXIT_SUCCESS
is a macro that will expand into an environment defined indicator to be returned from main
(or via exit
, 等等)来表示你的整个程序已经成功完成了它应该做的事情。它通常不会在这种情况之外使用。
printf
is used to send output to the stream associated with stdout
. For example, you might call printf
在您的终端中显示文本。
您的函数应该 return
the string literals,供 ranking_to_string
的调用者使用。
const char *ranking_to_string(hand_ranking_t r) {
switch (r) {
case STRAIGHT_FLUSH: return "STRAIGHT_FLUSH";
case FOUR_OF_A_KIND: return "FOUR_OF_A_KIND";
/* ... and so on ... */
default: return "Invalid thing";
}
}
示例程序:
#include <stdio.h>
typedef enum {
STRAIGHT_FLUSH,
FOUR_OF_A_KIND,
/* ... and so on ... */
} hand_ranking_t;
const char *ranking_to_string(hand_ranking_t r) {
switch (r) {
case STRAIGHT_FLUSH: return "STRAIGHT_FLUSH";
case FOUR_OF_A_KIND: return "FOUR_OF_A_KIND";
/* ... and so on ... */
default: return "Invalid thing";
}
}
int main(void) {
hand_ranking_t rank = FOUR_OF_A_KIND;
const char *rank_string = ranking_to_string(rank);
printf("My ranking is <%s>\n", rank_string);
}
输出:
My ranking is <FOUR_OF_A_KIND>
您的课程中可能没有涵盖,但可以通过使用 X-Macros 完全自动化 ranking_to_string
。此外,由于扑克牌具有价值,因此按它列出它们是有意义的。
#include <stdlib.h>
#include <stdio.h>
#define HANDS X(HIGH_CARD), X(PAIR), X(TWO_PAIR), X(THREE_OF_A_KIND), \
X(STRAIGHT), X(FLUSH), X(FULL_HOUSE), X(FOUR_OF_A_KIND), \
X(STRAIGHT_FLUSH), X(ROYAL_FLUSH)
#define X(name) name
enum hand { HANDS };
#undef X
#define X(name) #name
static const char *hand_str[] = { HANDS };
#undef X
static const size_t hand_size = sizeof hand_str / sizeof *hand_str;
int main(void) {
enum hand i, j;
for(i = 0; i < hand_size; i++) printf("%s\n", hand_str[i]);
i = FULL_HOUSE;
j = FLUSH;
printf("%s is %s than %s.\n",
hand_str[i], i < j ? "less" : "greater", hand_str[j]);
return EXIT_SUCCESS;
}
其中#
是预处理器的stringizing运算符。