版本庫url:
1)為menu子系統設計介面,並寫使用者範例**來實現原來的功能;
2)使用make和make clean來編譯程式和清理自動生成的檔案;
3)使menu子系統支援帶引數的複雜命令,並在使用者範例**中自定義乙個帶引數的複雜命令;
4)可以使用getopt函式獲取命令列引數。
callback增強可重用鍊錶實現包含於linkedlist.h與linkedlist.c中
shell中各命令功能的實現包含在cmdopt.h與cmdopt.c中
main函式包含於shelllet.c中
編譯時請使用
make
1.子系統設計介面
//用於使用者向命令列新增新的命令功能
int shellletconfig(linkedlist *head, char * cmd, int (*handler)());
//用於啟動命令列程式
int executeshelllet(linkedlist *head);
具體實現
int shellletconfig(linkedlist *l, char *cmd, int (*handler)())
p = (cmdnode *)malloc(sizeof(cmdnode));
p->cmd = cmd;
p->handler = handler;
addnode(l, (node *)p);
return0;}
int executeshelllet(linkedlist *l)
return
0;}
2.makefile編譯檔案
#
# makefile for shelllet program
#cc_pthread_flags = -lpthread
cc_flags = -c
cc_output_flags = -o
cc = gcc
rm = rm
rm_flags = -f
target = test
objs = linkedlist.o cmdopt.o shelllet.o
all:
$(objs)
$(cc) $(
cc_output_flags) $(
target) $(
objs)
.c.o:
$(cc) $(
cc_flags) $<
clean:
$(rm) $(
rm_flags) $(
objs) $(
target) *.bak
3.複雜指令解析
void cmd2arg(int *argc, char **argv)
if (*argc == 1)
}
使用者實現的複雜指令函式
int test(int argc, char *argv)
4.獲取命令列參
經cmd2arg處理後argv[1]開始均為命令列引數
void cmd2arg(int *argc, char **argv)
if (*argc == 1)
}
執行效果
我對老師的寫法做了一些修改,還是去掉了全域性鍊錶,這樣的話每次使用者(程式設計師)在使用這個程式的時候都得自己先建立乙個鍊錶,初始化之後再將鍊錶傳入executeshelllet函式中執行命令列程式。
這樣應該算是物件導向的實現思路吧,畢竟c中沒有類,不能定義乙個menu類再向其新增start方法。
其實這個程式有bug,不論輸什麼命令第一次都會失效。
我除錯之後發現是在第一次解析命令時字串比對函式strcmp出現錯誤,沒有返回正確結果的同時還改變了形參cmd的值。
就很神秘,這個函式的原型不是加了const麼,怎麼還能改變形參值的,還只出現一次。
感覺可能是標頭檔案include的問題,之前在沒加string.h的時候函式strtok也出現了一樣的問題。
試了很多沒有解決,就擱置了。
還有就是像加減乘除這樣有指令執行中含有scanf呼叫的命令2,執行結束後程式會執行乙個空指令(即「」)。
這個肯定是fget和scanf混用的問題,估計是add執行結束之後有個換行符\n還在輸入流裡,下一輪開始的時候被fget讀到了。
雖然在每個scanf後面單獨加個fget應該能解決,但是感覺這種方式非常蠢,也沒想到更好的方式,就算了。
這程式再拓展幾次估計就要不能維護了。
【swegnhan + 《軟體工程(c編碼實踐篇)》mooc課程作業
軟體工程實驗一
任務一 自行選擇乙個軟體專案,有背景說明 功能需求概述 專案名稱 互動新聞 背景說明 隨著社會的進步,網際網路技術日漸成熟,網路新聞成為人們獲取資訊的主要渠道。與傳統新聞相比,網路新聞具有自身的特點 不但具有報紙 電視等的一般功能,而且具有數位化 多 等的特殊優勢。所以網際網路中的網路新聞傳播變得越...
軟體工程實驗三
一 實驗名稱 詳細設計 二 實驗目的 根據需求分析 概要設計,完成系統的詳細設計 三 實驗主要內容 詳細設計的主要任務是設計每個模組的實現演算法 所需的區域性資料結構。詳細設計的目標有兩個 實現模組功能的演算法要邏輯上正確和演算法描述要簡明易懂。四 實驗原理 1 模組說明。說明該模組需要實現什麼功能...
軟體工程實驗三
部落格班級 ahpu軟體工程 作業要求 實驗三作業目標 學會使用 rational rose畫uml圖 學號3180701118 目錄5.飛機訂票系統 1 用例圖 1.使用 rational rose 建立執行者 actors 2.使用 rational rose 建立用例 3.使用 rationa...