C语言多级菜单实现:使用标题和标签
如果您想在多级菜单中使用标题和标签,您可以修改MenuItem结构体来包含title和label字符串。以下是修改后的代码示例:
#include "stm32f4xx.h"
typedef enum {
TYPE_MENU,
TYPE_SUBMENU
} MenuItemType;
typedef struct {
MenuItemType type;
void (*function)();
const char* title;
const char* label;
const struct MenuItem* submenu;
} MenuItem;
void delay_ms(uint32_t ms) {
ms *= (SystemCoreClock / 10000);
while(ms--) {
for (volatile uint32_t i = 0; i < 10000; i++);
}
}
void option1_submenu1() {
// 执行选项1的操作
printf("Executing Option 1 in Submenu 1\n");
delay_ms(1000);
}
void option2_submenu1() {
// 执行选项2的操作
printf("Executing Option 2 in Submenu 1\n");
delay_ms(1000);
}
void submenu1() {
while(1) {
// 显示子菜单1
printf("%s:\n", submenu1.title);
printf("1. Option 1\n");
printf("2. Option 2\n");
printf("3. Go back to main menu\n");
uint8_t submenuSelection = 0;
scanf("%d", &submenuSelection);
switch(submenuSelection) {
case 1:
option1_submenu1();
break;
case 2:
option2_submenu1();
break;
case 3:
// 返回主菜单
return;
default:
printf("Invalid selection\n");
delay_ms(1000);
break;
}
}
}
void submenu2() {
// 执行子菜单2的操作
printf("%s:\n", submenu2.title);
delay_ms(1000);
}
void submenu3() {
// 执行子菜单3的操作
printf("%s:\n", submenu3.title);
delay_ms(1000);
}
int main(void) {
// 初始化代码
while(1) {
// 显示主菜单
printf("Main Menu:\n");
MenuItem mainMenu[] = {
{TYPE_SUBMENU, NULL, "Submenu 1", "1. Submenu 1", submenu1},
{TYPE_SUBMENU, NULL, "Submenu 2", "2. Submenu 2", submenu2},
{TYPE_SUBMENU, NULL, "Submenu 3", "3. Submenu 3", submenu3},
{TYPE_MENU, NULL, NULL, "4. Exit", NULL}
};
for (int i = 0; i < sizeof(mainMenu) / sizeof(mainMenu[0]); i++) {
if (mainMenu[i].title != NULL) {
printf("%s\n", mainMenu[i].title);
}
printf("%s\n", mainMenu[i].label);
}
uint8_t selection = 0;
scanf("%d", &selection);
if (selection < 1 || selection > sizeof(mainMenu) / sizeof(mainMenu[0])) {
printf("Invalid selection\n");
delay_ms(1000);
continue;
}
MenuItem chosenItem = mainMenu[selection - 1];
if (chosenItem.type == TYPE_MENU) {
// 退出程序
printf("Exiting program\n");
delay_ms(1000);
return 0;
}
else if (chosenItem.type == TYPE_SUBMENU) {
chosenItem.submenu();
}
}
}
在此示例中,MenuItem结构体现在有一个title成员和一个label成员,分别用于显示菜单项的标题和标签。在菜单项的显示部分,我们首先检查title是否为NULL,如果不是,我们就打印出菜单项的标题,然后打印出菜单项的标签。
请注意,您可能需要根据您的具体需求进行修改和扩展。希望这对您有所帮助!如果您有任何进一步的问题,请随时提问。
原文地址: http://www.cveoy.top/t/topic/n3B 著作权归作者所有。请勿转载和采集!