(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运算符。