高軟實驗七報告

將menu設計爲可重用的子系統

一、實驗要求

  • menu 子系統設計接口,並寫用戶範例代碼來實現原來的功能
  • 使用 makemake clean 來編譯程序和清理自動生成的文件
  • 使 menu 子系統支持帶參數的複雜命令,並在用戶範例代碼中自定義一個帶參數的複雜命令(這個視頻中沒有給出,請自行完成)
  • 可以使用 getopt 函數獲取命令行參數

二、實驗思路與過程

  • 利用 mkdir 命令新建 lab7 文件夾,並使用 cp 命令將上上次的文件拷貝到 lab7
  • 查看源代碼,理清思路,將整個 menu 系統模塊化,並編寫用戶範例代碼 test.c 來實現以前的小菜單的功能
  • 參照視頻,編寫 Makefile 文件以進行自動編譯和清理中間文件
  • 改進程序,以使得程序能夠支持自定義的,帶參數的命令
  • 自定義帶參數的命令
  • 對程序中新增加的代碼進行模塊化,以使得整個系統更易於維護和修改

三、關鍵代碼

menu.c

test.c


四、運行結果


五、實驗中遇到的問題

  • 在編寫 得到命令行參數的函數過程中,需要返回兩個值,argvargc,而函數只能返回一個值,這就產生了矛盾。最後通過指針得到了解決
  • 對於老師所用的 fgets 函數有過疑問,不明白最後爲什麼要去掉 \n,最後經過實驗發現,scanf 函數在將用戶輸入的字符串存儲到內存中時,會自動將用戶執行命令時 輸入的 \n 刪除,而 fgets 函數則不會刪除,它會將所有的輸入字符存儲到內存中去,這也是爲什麼我們要在代碼中實現去掉 \n 的原因
  • strtok函數在調用時出錯,經過查閱資料發現,由於 strtok 函數會改變原始字符串的內容,因此在第一次調用的時候,傳遞給該函數的第一個參數——即要分割的原始字符串——不能是指向字符常量的指針,比如 char * p = "Original string to be divided" 就不能作爲第一個參數傳遞進去。第一個參數只能是一個字符數組的首地址,比如 char p[] = "Original string to be divided" 就可以作爲待分割的字符串傳遞進去


六、實驗心得

  • 這次實驗所花的時間還是不短的,但是通過這次實驗,我也學到了不少的東西,也有一部分知識還有待進一步學習,比如說 makefile
  • 對於軟件工程這一概念有了新的認識,尤其是其中的重用模塊化 的思想
  • 對於C語言的字符指針這一塊有了更深入的理解


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章