將menu設計爲可重用的子系統
一、實驗要求
- 爲 menu 子系統設計接口,並寫用戶範例代碼來實現原來的功能
- 使用 make 和 make clean 來編譯程序和清理自動生成的文件
- 使 menu 子系統支持帶參數的複雜命令,並在用戶範例代碼中自定義一個帶參數的複雜命令(這個視頻中沒有給出,請自行完成)
- 可以使用 getopt 函數獲取命令行參數
二、實驗思路與過程
- 利用
mkdir
命令新建 lab7 文件夾,並使用cp
命令將上上次的文件拷貝到 lab7 中 - 查看源代碼,理清思路,將整個 menu 系統模塊化,並編寫用戶範例代碼 test.c 來實現以前的小菜單的功能
- 參照視頻,編寫 Makefile 文件以進行自動編譯和清理中間文件
- 改進程序,以使得程序能夠支持自定義的,帶參數的命令
- 自定義帶參數的命令
- 對程序中新增加的代碼進行模塊化,以使得整個系統更易於維護和修改
三、關鍵代碼
menu.c
test.c
四、運行結果
五、實驗中遇到的問題
- 在編寫 得到命令行參數的函數過程中,需要返回兩個值,argv 和 argc,而函數只能返回一個值,這就產生了矛盾。最後通過指針得到了解決
- 對於老師所用的 fgets 函數有過疑問,不明白最後爲什麼要去掉
\n
,最後經過實驗發現,scanf 函數在將用戶輸入的字符串存儲到內存中時,會自動將用戶執行命令時 輸入的\n
刪除,而 fgets 函數則不會刪除,它會將所有的輸入字符存儲到內存中去,這也是爲什麼我們要在代碼中實現去掉\n
的原因 - strtok函數在調用時出錯,經過查閱資料發現,由於 strtok 函數會改變原始字符串的內容,因此在第一次調用的時候,傳遞給該函數的第一個參數——即要分割的原始字符串——不能是指向字符常量的指針,比如
char * p = "Original string to be divided"
就不能作爲第一個參數傳遞進去。第一個參數只能是一個字符數組的首地址,比如char p[] = "Original string to be divided"
就可以作爲待分割的字符串傳遞進去
六、實驗心得
- 這次實驗所花的時間還是不短的,但是通過這次實驗,我也學到了不少的東西,也有一部分知識還有待進一步學習,比如說 makefile
- 對於軟件工程這一概念有了新的認識,尤其是其中的重用模塊化 的思想
- 對於C語言的字符指針這一塊有了更深入的理解