如果您想在多级菜单中使用标题和标签,您可以修改MenuItem结构体来包含titlelabel字符串。以下是修改后的代码示例:

#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,如果不是,我们就打印出菜单项的标题,然后打印出菜单项的标签。

请注意,您可能需要根据您的具体需求进行修改和扩展。希望这对您有所帮助!如果您有任何进一步的问题,请随时提问。

C语言多级菜单实现:使用标题和标签

原文地址: http://www.cveoy.top/t/topic/n3B 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录