如何在 C++ 中把列舉型轉換為字串
本文將解釋幾種在 C++ 中把列舉型別轉換為 string
變數的方法。
使用 const char*
陣列將列舉型別轉換為字串
列舉 enum
是一個內建型別,可用於宣告通常以陣列形式形成的較小的命名整數。這種機制提供了一種不易出錯和更易讀的方式來表示一組整數值。
列舉元素可以有一個位置值(如我們的示例程式碼中 Banana
有 0
),也可以有一個顯式值(宣告為 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
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