我正在嘗試制作一個簡單的命令列界面,但我在決議命令時遇到了問題:
process_t 是一個結構體,包含命令路徑,引數存盤在變數 argv 中。
int parse_cmd(char* tokens[], process_t* commands) {
assert(tokens!=NULL);
assert(commands!=NULL);
int position = 0;
int commandNumber = 0;
for(int i=0; tokens[i] != NULL; i ){
if(is_reserved(tokens[i]) == 0 && tokens[i 1] != NULL) continue;
int end = is_reserved(tokens[i]) == 0 ? i 1 : i;
int argc = position;
int count = 0;
process_t newProcess;
char* argv[MAX_CMD_SIZE] = {NULL};
for(argc; argc < end; argc ) {
argv[count] = tokens[argc];
count = count 1;
}
newProcess.path = tokens[position];
newProcess.argv = argv;
position = i 1;
commands[commandNumber] = newProcess;
commandNumber = commandNumber 1;
}
}
int main(int argc, char* argv[]) {
char path[MAX_LINE_SIZE];
char line[MAX_LINE_SIZE];
char* cmdline[MAX_CMD_SIZE];
process_t cmds[MAX_CMD_SIZE];
getcwd(path, MAX_LINE_SIZE);
while (1) {
printf("mini@shell:%s$ ", path);
scanf("%[^\n]%*c", line);
trim(line);
clean(line);
tokenize(line, cmdline);
parse_cmd(cmdline, cmds);
toString(cmds);
break;.
}
return -1;
}
輸入: ls -l ; grep ^a
為什么陣列只包含最后一次迭代的 argv 值?
輸出 :
路徑:ls => argv = {grep, ^a, (null)} 路徑:grep => argv = {grep, ^a, (null)}
uj5u.com熱心網友回復:
您正在嘗試使用塊本地陣列argv,它為每個命令重新創建,更糟糕的是,在parse_cmd回傳后甚至不再存在。必須使用具有足夠生命周期的陣列物件;你可以通過改變來做到這一點
char* argv[MAX_CMD_SIZE] = {NULL};
到
char **argv = calloc(end-position 1, sizeof *argv);
請注意,free當不再需要時,您必須使用此物件。
另請注意,您忘記了return commandNumber;from parse_cmd; 否則,您將無法知道找到了多少命令。
uj5u.com熱心網友回復:
我還找到了一種方法,甚至不需要復制我宣告的本地陣列,只需更改包含保留字符的索引的值即可。
所以令牌將是這樣的: {? ls ?, ? -l ?, NULL, ? grep ?, ? ^a ?, NULL}
int parse_cmd(char* tokens[], process_t* commands) {
assert(tokens!=NULL);
assert(commands!=NULL);
int position = 0;
int commandNumber = 0;
for(int i=0; tokens[i] != NULL; i ){
if(is_reserved(tokens[i]) == 0 && tokens[i 1] != NULL) continue;
int end = is_reserved(tokens[i]) == 0 ? i 1 : i;
commands[commandNumber].path = tokens[position];
commands[commandNumber].argv = &tokens[position];
commands[commandNumber].next = &commands[commandNumber] 1;
tokens[end] = NULL;
commandNumber = commandNumber 1;
position = i 1;
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/352413.html
上一篇:C 命令列中的CD命令
