C 語言初學教材 - 第四章 管理使用者帳號

我們接下來繼續討論使用者帳號的登入程式,目前的版本只有提供使用者註冊及登入,我們未來會發展另一個通訊錄程式,讓登入的使用者有管理自己通訊錄的權限。現在,我們先把心思放在帳號登入程式上面吧!



同樣是權限的問題,我們應該要給某個使用者具有管理帳號的權限,如同網路論壇、 BBS 站台的管理員或各版的版主。第一個問題會是要給哪個使用者管理的權限,第二個問題會是要有哪些管理的功能?


解決第一個問題比較簡單,我們只需要給某個預設的使用者這樣的權限即可,就像大部分的 UNIX-Like 作業系統都有一個 root 帳號, root 具有絕對的權力可以對系統做任何調整,包含檢閱、刪除、移動每個帳號的檔案。


因此,我們預設一個 administrator 的帳號在 userID[0] 的位置,所以我們會加入以下的程式碼
27
28
29
// administrator 為預設的管理者帳號, 0000 為其密碼
strcpy(userID[0], "administrator");
strcpy(userCODE[0], "0000");


這裡要留意的一點,字串在 C 語言中是複合的資料型態,所以需要用到標準函數庫 string.h 函數 strcpy() 來進行拷貝的工作。


第二個問題並不麻煩,因為使用者可以自己新增使用者帳號,所以管理者應該要具有刪除帳號的功能,另外為了方便管理,我們打算額外提供一個管理模式的介面,管理者也應該要有印出帳號列表、搜尋帳號、排序帳號等功能,如下列表
指令功能
exit離開管理模式
list印出帳號列表
search搜尋特定帳號
delete刪除特定帳號
sort排序帳號列表


管理者輸入正確的帳號、密碼就會進入管理模式,所以我們會在比對帳號、密碼的 for 迴圈加入以下管理模式的程式碼
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
if (i == 0 && !strcmp(inputCode, userCODE[i])) {
    printf("\n\n您成功以管理員模式登入....\n");
    printf("將入帳號管理模式,請在提示符號 # 後輸入指令\n");
                     
    while (1) {
        printf("\n# ");
        scanf("%s", instruction);
                         
        // exit 為離開管理模式的指令
        if (!strcmp(instruction, "exit")) {
            break;
        }
                         
        // list 為列印使用者列表的指令
        if (!strcmp(instruction, "list")) {
            printf("\n您即將開啟印出使用者帳號列表的功能....\n");
            continue;
        }
                         
        // search 為查詢帳號指令
        if (!strcmp(instruction, "search")) {
            printf("\n您即將開啟查詢使用者帳號的功能....\n");
            continue;
        }
                         
        // delete 為刪除帳號指令
        if (!strcmp(instruction, "delete")) {
            printf("\n您即將開啟刪除使用者帳號的功能....\n");
            continue;
        }
                         
        // sort 為排序指令
        if (!strcmp(instruction, "sort")) {
            printf("\n您即將開啟排序使用者帳號列表的功能....\n");
            continue;
        }
    }
                     
    printf("\n\n您即將離開管理模式,請重新登入....\n\n");
    state = RUN;
    break;
}


進入管理模式也就是進入另一個 while (1) 迴圈,管理模式以井字號 # 作為提示輸入指令的符號,然後以字元陣列 instruction 變數接收使用者輸入的指令,用到新的變數,別忘了要先宣告
31
32
// 宣告接收管理模式指令
char instruction[LEN];


我們同樣以 exit 為離開管理模式指令,其他的指令還沒實際寫出來,就先印出提示字串來代替吧!


完整的範例程式碼及編譯執行,請繼續參考


問題與討論
  1. 為什麼進入管理模式要用另一個 while (1) 迴圈?
  2. 還沒實作出來的指令先用提示訊息代替,這種規劃程式的方法有什麼優點?
  3. 離開管理模式與結束程式的指令都是 exit ,這樣的設計方式好不好?




沒有留言: