我正在嘗試從命令列保存我的引數及其引數,如下所示
./run cat hello.txt : grep left : wc -c
我想在不知道數量的情況下按如下方式將陣列中的每個引數分開 :
char *cat_args[] = {"cat", "tests/nevermind", NULL};
char *grep_args[] = {"grep", "left", NULL};
char *cut_args[] = {"wc", "-c", NULL};
我怎樣才能做到這一點?
int nbProc = 2;
for (int i = 0; i < argc; i ){
if (strcmp(argv[i], ":") == 0){
nbProc ;
}
}
int indice_debut[nbProc-2];
int j = 0;
for (int i = 1; i < argc; i ){
if (strcmp(argv[i], ":") == 0){
argv[i] = NULL;
indice_debut[j] = i 1;
j ;
}
}
有了這個,我能夠得到,indice_debut = {4,7}因為:在第 4 和第 7 位。
我試圖這樣運行它,但沒有運氣,我這樣做是為了我可以使用execvp.
execvp(argv[indice_debut[0]], argv indice_debut[0]);
謝謝
uj5u.com熱心網友回復:
使用 動態分配指標陣列malloc()。最多可以有argc/2命令,因為最壞的情況是交替word : word : word : ...,所以分配那么多元素。陣列元素可以指向 的元素argv,您可以用:空指標替換引數以結束每個子命令。
int main(int argc, char **argv) {
if (argc < 2) {
printf("At least one command is required\n");
exit(1);
}
char **arg_arrays = malloc(argc/2 * sizeof *arg_arrays);
int array_index = 0;
int arg_index = 0;
while (arg_index < argc) {
arg_arrays[array_index ] = &argv[arg_index];
for (; arg_index < argc && strcmp(argv[arg_index], ":") != 0; arg_index ) {}
argv[arg_index] = NULL;
}
// Execute each of the subcommands
for (int i = 0; i < array_index; i ) {
pid_t pid = fork();
if (pid == 0) {
execvp(arg_arrays[i][0], arg_arrays[i]);
} else if (pid < 0) {
perror("fork");
exit(1);
}
}
// wait for all the subcommands to finish
while (wait(NULL) > 0) {}
}
這只是一個如何決議子命令并執行它們的簡單示例。如果您想從一個命令傳遞到下一個命令,則需要添加該代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/376778.html
下一篇:使用地址到t陣列欄位創建t*陣列
