C - 在 argv1 中使用指针存储命令行参数时出错



我正在尝试实现一个shell,当用户输入多个命令时,在命令提示符下,我希望这些命令存储在 argv1 数组

如下所示
argv1[0]="ls -al"  
argv1[1]=command 2 with arguments  
argv1[2]=command 3 with arguments

我写的如下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_LEN 1024
int main()
{
char line[BUFFER_LEN];  //get command line
char *argv[100];        //user command
char **argv1[10];       //user command
int n = 0;
int argc;
fgets(line, BUFFER_LEN, stdin);
char *token;            //split command into separate strings
token = strtok(line, " ");
int i = 0;
while (token != NULL) {
argv[i] = token;
token = strtok(NULL, " ");
i++;
}
argv[i] = NULL;         //set last value to NULL for execvp
argv1[n] = argv;        //we are storing commands in format argv1={"ls -al","wc","tee"}
n++;                    //for argv1 tracking
printf("value in argv1 is %sn", argv[n - 1]);
argc = i;               //get arg count
for (i = 0; i < argc; i++) {
printf("%sn", argv[i]);        //print command/args
}
}

我希望这个带有参数的完整命令在 argv1[0] 中如何做到这一点
。这是我想不起来的。

我想做一些这样的事情

int
main(int argc, char *argv[])
{
char *ls[] = {"ls", "-al", NULL};
char *rev[] = {"rev", NULL};
char *nl[] = {"nl", NULL};
char *cat[] = {"cat", "-e", NULL};
char **cmd[] = {ls, rev, nl, cat, NULL};
pipeline(cmd);
return (0);
}
~

在管道函数中,我将一个接一个地传递命令,以便在打开多个管道和文件描述符的 while 循环中执行。将替换从 stdout 到 while 循环中的管道的 execlp 调用中的输出,原始代码中的命令正在进入 argv[0]=ls , argv[1]=-al, 其中我想实现
some_pointer=argv[0]+argv[1]
这里一些指针是我将在主函数管道中传递的命令 即管道(某个指针(,其余代码将在pipleine函数中传递带有参数的完整命令上执行,这就是我想要实现的如何实现是我无法理解的。 在实际实现中,我将通过用户的 fgets 获取输入,而不是我上面提到的字符数组 *ls、*nl 等。

您需要使用argvargc。 这是我根据你的尝试快速鞭策的东西。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_LEN 256
int main(int argc, char *argv[])
{
/* Command and arguments */
char *cmd = NULL;
char args[argc][BUFFER_LEN] ;
/* Print command */
printf("Command was: %s. ", argv[1]);
/* Return early if no arguments */
if(argc == 2) return 1;
/* Copy arguments */
for(int i=2; i<argc; i++)
{
strncpy(args[i], argv[i], sizeof(argv[i]));
}
/* Print args */
for(int j=2; j<argc; j++)
{
printf("Arg %d is %s ", j, argv[j]);
}
return 0;
}

样本:

$ ./test ls
Command was: ls.
$ ./test ls -al
Command was: ls. Arg 2 is -al

他不想在主条目中获取 argv,而是在之后读取输入以模拟 shell。

检查getopt功能也许可以帮助您

最新更新