首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言入門

C語言實現簡單交互式菜單系統

     編輯:C 語言入門

菜單驅動程序架構

經典的字符菜單交互模式,包含:選項顯示、輸入驗證、功能分發、輸入緩衝清理。

完整代碼實現

#include <stdio.h>

char get_choice(void);
char get_first(void);
int get_int(void);
void count(void);

int main() {
    int choice;
    while ((choice = get_choice()) != 'q') {
        switch (choice) {
            case 'a': printf("Buy low, sell high\n"); break;
            case 'b': putchar('\a'); break;  // 蜂鳴器
            case 'c': count(); break;
            default:  printf("Invalid choice\n"); break;
        }
    }
    printf("Bye.\n");
    return 0;
}

// 計數功能
void count(void) {
    int n, i;
    printf("Count how far? Enter an integer: ");
    n = get_int();
    for (i = 1; i <= n; i++) printf("%d\n", i);
    while (getchar() != '\n') continue;  // 清理緩衝區
}

// 獲取合法選項
char get_choice(void) {
    char ch;
    printf("Enter the letter of your choice:\n");
    printf("a. advice   b. bell\n");
    printf("c. count    d. quit\n");
    ch = get_first();
    while ((ch < 'a' || ch > 'c') && ch != 'q') {
        printf("Please respond with a, b, c, or q\n");
        ch = get_first();
    }
    return ch;
}

// 獲取首個非換行字符
char get_first(void) {
    char ch = getchar();
    while (getchar() != '\n') continue;  // 丟棄行內剩餘字符
    return ch;
}

// 獲取合法整數
int get_int(void) {
    int input;
    char ch;
    while (scanf("%d", &input) != 1) {
        while ((ch = getchar()) != '\n') putchar(ch);  // 回顯錯誤輸入
        printf(" is not an integer.\nPlease enter an integer (e.g. 25, -178, 3): ");
    }
    return input;
}

核心模塊解析

1. 輸入緩衝區清理:get_first()

char get_first(void) {
    char ch = getchar();
    while (getchar() != '\n') continue;  // 關鍵:讀取並丟棄直到換行
    return ch;
}

解決 scanf/getchar 留下的換行符干擾後續輸入問題。

2. 魯棒整數輸入:get_int()

while (scanf("%d", &input) != 1) {  // 返回值非1表示匹配失敗
    while ((ch = getchar()) != '\n') putchar(ch);  // 回顯非法字符
    printf(" is not an integer...\n");
}
  • scanf 返回成功匹配的項數,非 1 即格式錯誤
  • 清理緩衝區時同步回顯,用戶可見輸入錯誤
  • 循環直到獲得合法整數

3. 菜單邏輯分離

  • get_choice():只負責顯示菜單、獲取並驗證選項
  • main():只負責分發調用
  • 各功能函數(count())獨立實現

擴展建議

需求實現方向
子菜單菜單函數返回枚舉/結構體,main 狀態機調度
動態菜單選項存結構體數組:{鍵, 描述, 函數指針}
輸入歷史/編輯使用 readline 庫或自行實現行編輯
本地化菜單字串外置資源文件,運行時加載

常見坑點提醒

  • 緩衝區殘留: 任何 scanf/getchar 後必須清理到 '\n'
  • EOF 處理: getchar() 返回 EOF 時應退出,避免死循環
  • 大小寫敏感: 如需不區分大小寫,用 tolower(ch) 統一
  • 緩衝區溢出: 避免 gets(),用 fgets() 或手寫長度限制
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved