C/C++表驱动法
第1章 原始底代码
#include <cstdio>
#include <cstring>static void Func1(const char *str);int main() {Func1("Sun");return 0;
}void Func1(const char *str){if(strcmp(str, "Mon") == 0){printf("Monday\n");} else if(strcmp(str, "Tue") == 0){printf("Tuesday\n");} else if(strcmp(str, "Wed") == 0){printf("Wednesday\n");} else if(strcmp(str, "Thur") == 0){printf("Thursday\n");} else if(strcmp(str, "Fri") == 0){printf("Friday\n");} else if(strcmp(str, "Sat") == 0){printf("Saturday\n");} else if(strcmp(str, "Sun") == 0){printf("Sunday\n");} else {printf("Unknown day\n");}
}
第2章 方法一
#include <cstdio>
#include <cstring>typedef struct {char *weekAbbreviation;char *weekFullName;
} TWeek;static TWeek arr[] = {{"Mon", "Monday"},{"Tue", "Tuesday"},{"Wed", "Wednesday"},{"Thu", "Thursday"},{"Fri", "Friday"},{"Sat", "Saturday"},{"Sun", "Sunday"}
};static void Func2(const char *str){for(int i = 0; i < sizeof (arr)/ sizeof (arr[0]); i++){if(strcmp(arr[i].weekAbbreviation, str) == 0){printf("%s\n", arr[i].weekFullName);}}
}int main(int argc, char **argv){Func2("Thu");return 0;
}
第3章 方法2
#include <cstring>
#include <cstdio>// 枚举:代表一周七天
typedef enum {Mon, // 默认为 0Tue, // 1Wed, // 2Thu, // 3Fri, // 4Sat, // 5Sun, // 6TotalDays // 自动为 7,可以用于循环边界等用途
} TWeekEnum;// 结构体:关联枚举与星期全称
typedef struct {TWeekEnum weekAbbreviation;const char *weekFullName; // 更安全地使用 const char*
} TWeek;// 静态全局数组:枚举到全名的映射
static TWeek array[] = {{Mon, "Monday"},{Tue, "Tuesday"},{Wed, "Wednesday"},{Thu, "Thursday"},{Fri, "Friday"},{Sat, "Saturday"},{Sun, "Sunday"}
};// 根据枚举值输出对应的星期全名
static void Func3(TWeekEnum weekEnum) {for (int i = 0; i < TotalDays; ++i) {if (array[i].weekAbbreviation == weekEnum) {printf("Day: %s\n", array[i].weekFullName);return;}}printf("Unknown day.\n");
}// 测试函数
int main() {Func3(Mon); // 输出 MondayFunc3(Wed); // 输出 WednesdayFunc3(Sun); // 输出 SundayFunc3((TWeekEnum)10); // 输出 Unknown day.return 0;
}
第4章 方法3
3.1 大杂烩
#include <cstring>
#include <stdio.h>typedef void (*pFunc)(void);typedef struct{const char *weekAbbreviation;pFunc func;
}TWeek;static void func1(void){printf("Monday\n");
}static void func2(void){printf("Tuesday\n");
}static void func3(void){printf("Wednesday\n");
}static void func4(void){printf("Thursday\n");
}static void func5(void){printf("Friday\n");
}static void func6(void){printf("Saturday\n");
}static void func7(void){printf("Sunday\n");
}static TWeek arr[] = {{"Mon", func1},{"Tue", func2},{"Wed", func3},{"Thu", func4},{"Fri",func5},{"Sat", func6},{"Sun", func7}
};void funcHandle(const char *str){int arrSize = sizeof (arr) / sizeof (arr[0]);for(int i = 0; i < arrSize; i++){if(strcmp(str, arr[i].weekAbbreviation)==0){arr[i].func();}}
}int main(){funcHandle("Sun");
};
3.2 C++语言风格
-
WeekHandler.h
#ifndef WEEKHANDLER_H
#define WEEKHANDLER_H#include <cstring>// 定义函数指针类型
typedef void (*pFunc)(void);// 定义包含星期缩写和对应函数的结构体
typedef struct {const char *weekAbbreviation;pFunc func;
} TWeek;class WeekHandler {
public:WeekHandler();void funcHandle(const char *str);private:static void func1(void);static void func2(void);static void func3(void);static void func4(void);static void func5(void);static void func6(void);static void func7(void);static TWeek arr[7];
};#endif // WEEKHANDLER_H
-
WeekHandler.cpp
#include "WeekHandler.h"
#include <cstdio>// 定义并初始化静态成员变量
TWeek WeekHandler::arr[] = {{"Mon", WeekHandler::func1},{"Tue", WeekHandler::func2},{"Wed", WeekHandler::func3},{"Thu", WeekHandler::func4},{"Fri", WeekHandler::func5},{"Sat", WeekHandler::func6},{"Sun", WeekHandler::func7}
};// 构造函数
WeekHandler::WeekHandler() {// 如果有需要初始化的内容可以在这里添加
}// 成员函数:处理输入字符串并调用对应的函数
void WeekHandler::funcHandle(const char *str) {int arrSize = sizeof(arr) / sizeof(arr[0]);for (int i = 0; i < arrSize; ++i) {if (std::strcmp(str, arr[i].weekAbbreviation) == 0) {arr[i].func(); // 调用对应的函数return; // 找到匹配后退出循环}}printf("No matching day found.\n"); // 如果没有找到匹配项
}// 静态成员函数定义
void WeekHandler::func1(void) {printf("Monday\n");
}void WeekHandler::func2(void) {printf("Tuesday\n");
}void WeekHandler::func3(void) {printf("Wednesday\n");
}void WeekHandler::func4(void) {printf("Thursday\n");
}void WeekHandler::func5(void) {printf("Friday\n");
}void WeekHandler::func6(void) {printf("Saturday\n");
}void WeekHandler::func7(void) {printf("Sunday\n");
}
- main.cpp
#include "WeekHandler.h"
#include <iostream>
#include <memory>int main() {WeekHandler handler;handler.funcHandle("Sun");handler.funcHandle("Sun");std::unique_ptr<WeekHandler> funcHandle = std::make_unique<WeekHandler>();funcHandle->funcHandle("Thu");funcHandle->funcHandle("Mon");return 0;
}
3.3 c语言风格
-
week_handler.h
#ifndef WEEK_HANDLER_H
#define WEEK_HANDLER_H#include <cstddef> // For size_t// 定义函数指针类型
typedef void (*pFunc)(void);// 定义包含星期缩写和对应函数的结构体
typedef struct {const char *weekAbbreviation;pFunc func;
} TWeek;// 声明处理函数
void funcHandle(const char *str);#endif // WEEK_HANDLER_H
-
week_handler.c
#include "week_handler.h"
#include <cstring>
#include <cstdio>// 静态函数定义
static void func1(void) {printf("Monday\n");
}static void func2(void) {printf("Tuesday\n");
}static void func3(void) {printf("Wednesday\n");
}static void func4(void) {printf("Thursday\n");
}static void func5(void) {printf("Friday\n");
}static void func6(void) {printf("Saturday\n");
}static void func7(void) {printf("Sunday\n");
}// 静态数组,包含星期缩写及其对应的函数
static TWeek arr[] = {{"Mon", func1},{"Tue", func2},{"Wed", func3},{"Thu", func4},{"Fri", func5},{"Sat", func6},{"Sun", func7}
};// 处理输入字符串并调用对应的函数
void funcHandle(const char *str) {size_t arrSize = sizeof(arr) / sizeof(arr[0]);for (size_t i = 0; i < arrSize; ++i) {if (std::strcmp(str, arr[i].weekAbbreviation) == 0) {arr[i].func(); // 调用对应的函数return; // 找到匹配后退出循环}}printf("No matching day found.\n"); // 如果没有找到匹配项
}
- main.c
#include "week_handler.h"int main() {funcHandle("Sun");return 0;
}