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

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



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


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


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


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


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


管理者輸入正確的帳號、密碼就會進入管理模式,所以我們會在比對帳號、密碼的 for 迴圈加入以下管理模式的程式碼
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 變數接收使用者輸入的指令,用到新的變數,別忘了要先宣告
// 宣告接收管理模式指令
char instruction[LEN];


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


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


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




沒有留言: