我編寫了一個程序,它從標準輸入中讀取一條命令行,並將其傳遞給應該解析爲標記的函數。爲什麼我的解析函數不返回所有預期的標記?
這是解析函數:
char** parse_cmdline(char* cmdline) {
char ** arr = malloc(10 * sizeof(char*));
for (int i =0 ; i < 10; ++i)
arr[i] = malloc(30 * sizeof(char));
char * token = strtok(cmdline, " ");
int i = 0;
while(token != NULL) {
if(i > 9) arr = realloc(arr, (i+10)*sizeof(char*));
arr[i] = token;
token = strtok(NULL, " ");
i++;
}
printf("flag1");
return arr;
}
這是我如何使用它,它main()
:
int main() {
int status;
pid_t pid;
pid = fork();
while(1) {
if(pid < 0) {
status = -1;
perror("Fork");
} else if(pid == 0) {
char* cmd;
printf("$");
if(fgets(cmd, sizeof cmd, stdin) == NULL) break;
parse_cmdline(cmd);
} else {
if(waitpid(pid, &status, 0) != pid) {
status = -1;
}
break;
}
}
return 0;
}
這是我提供給我的程序輸入的例子:
ls l a
預期產出應該是:
l
(也就是第二個參數,通過我的解析函數打印)
字面上沒有任何反應。甚至沒有printf(「flag1」);打印。但是,如果我刪除char ** commands
並將printf("%s", commands[0]);
放在parse_cmdline函數中,除im未分配返回值外,其他所有函數都可以正常工作。爲什麼以及如何解決它?
按照要求,這裏是我的代碼全部:
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
char** parse_cmdline(char* cmdline) {
char ** arr = malloc(10 * sizeof(char*));
for (int i =0 ; i < 10; ++i)
arr[i] = malloc(30 * sizeof(char));
char * token = strtok(cmdline, " ");
int i = 0;
while(token != NULL) {
if(i > 9) arr = realloc(arr, (i+10)*sizeof(char*));
arr[i] = token;
token = strtok(NULL, " ");
i++;
}
printf("%s\n", arr[1]);
return arr;
}
發佈一個最小的,完整的,可驗證的例子。 – EOF
你還需要什麼? –
我可以粘貼到一個文件並進行編譯,加上一個輸入,我可以將其輸入到編譯結果中。可能是一個輸出,我可以比較程序運行的輸出。 – EOF