如何在 C++ 中把列舉型轉換為字串

Jinku Hu 2023年1月30日 2020年10月27日
  1. 使用 const char*陣列將列舉型別轉換為字串
  2. 使用自定義函式將一個列舉轉換為一個字串
如何在 C++ 中把列舉型轉換為字串

本文將解釋幾種在 C++ 中把列舉型別轉換為 string 變數的方法。

使用 const char*陣列將列舉型別轉換為字串

列舉 enum 是一個內建型別,可用於宣告通常以陣列形式形成的較小的命名整數。這種機制提供了一種不易出錯和更易讀的方式來表示一組整數值。

列舉元素可以有一個位置值(如我們的示例程式碼中 Banana0),也可以有一個顯式值(宣告為 enum Fruit { Banana = 34, ...})。

這個例子展示瞭如何利用列舉元素的隱式值從陣列中訪問相應的字串值。注意,我們在 main 函式的開頭用 1-4 範圍內的值初始化隨機 input 變數,以更好地展示現實中真實的場景。

#include <iostream>
#include <string>
#include <chrono>

using std::cout; using std::cin;
using std::endl; using std::string;

enum Fruit { Banana, Coconut, Mango, Carambola, Total } ;
static const char *enum_str[] =
        { "Banana Pie", "Coconut Tart", "Mango Cookie", "Carambola Crumble" };

int main(){
    std::srand(std::time(nullptr));
    int random = rand() % Total;
    auto input = static_cast<Fruit>(random);

    switch (input) {
        case Banana: cout << enum_str[Banana] << endl; break;
        case Coconut: cout << enum_str[Coconut] << endl; break;
        case Mango: cout << enum_str[Mango] << endl; break;
        case Carambola: cout << enum_str[Carambola] << endl; break;
        case Total: cout << "Incorrect ingredient!" << endl; break;
    }

    return EXIT_SUCCESS;
}

輸出:

Banana Pie

使用自定義函式將一個列舉轉換為一個字串

或者,我們也可以定義自己的函式,它接受一個整數作為引數並返回一個字串值。字串變數是用函式內部的 enum_str 陣列中的 const char*值初始化的。如果你把 Total 值作為引數傳給 getStringForEnum 函式,它將返回一些垃圾值,因為 enum_str 陣列只有 4 個元素。

#include <iostream>
#include <string>
#include <chrono>

using std::cout; using std::cin;
using std::endl; using std::string;

enum Fruit { Banana, Coconut, Mango, Carambola, Total } ;
static const char *enum_str[] =
        { "Banana Pie", "Coconut Tart", "Mango Cookie", "Carambola Crumble" };

string getStringForEnum( int enum_val )
{
    string tmp(enum_str[enum_val]);
    return tmp;
}

int main(){
    string todays_dish = getStringForEnum(Banana);
    cout << todays_dish << endl;

    return EXIT_SUCCESS;
}

輸出:

Banana Pie

在上述列舉型別中加入 Total 元素可以有實際的用途。首先,它代表了列舉中可以作為迴圈引數利用的元素數量,如下例程式碼所示。第一個迴圈從 enum_str 陣列中提取每個字串,並將它們推送到 enum_strigs 向量變數中。第二次迭代將 enum_strigs 的內容列印出來到控制檯。

#include <iostream>
#include <string>
#include <chrono>
#include <vector>

using std::cout; using std::cin;
using std::endl; using std::string;
using std::vector;

enum Fruit { Banana, Coconut, Mango, Carambola, Total } ;
static const char *enum_str[] =
        { "Banana Pie", "Coconut Tart", "Mango Cookie", "Carambola Crumble" };

string getStringForEnum( int enum_val )
{
    string tmp(enum_str[enum_val]);
    return tmp;
}

int main(){
    vector<string> enum_strigs {};
    enum_strigs.reserve(Total);

    for (int i = 0; i < Total; ++i) {
        enum_strigs.push_back(getStringForEnum(i));
    }

    for (const auto &item : enum_strigs) {
        cout << item << endl;
    }
    return EXIT_SUCCESS;
}

輸出:

Banana Pie
Coconut Tart
Mango Cookie
Carambola Crumble
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C++ Enum