我花了很多时间思考这个问题,但尚未找到答案。我有一些解决方案,但它们都会产生内存泄漏......
我有这些功能:
char *read_line(void)
{
char *line = NULL;
size_t bufsize = 0;
getline(&line, &bufsize, stdin);
return line;
}
#define BUFSIZE 64
#define DELIM " \t\r\n\a"
char **split_line(char *line)
{
int bufsize = BUFSIZE;
int position = 0;
char **argumentlist = malloc(bufsize * sizeof(char*));
char *argument;
if (!argumentlist) {
fprintf(stderr, "allocation error\n");
exit(EXIT_FAILURE);
}
argument = strtok(line, DELIM);
while (argument != NULL)
{
argumentlist[position] = argument;
position++;
if (position >= bufsize)
{
bufsize += SP_BUFSIZE;
argumentlist = realloc(argumentlist, bufsize * sizeof(char*));
if (!argumentlist)
{
fprintf(stderr, "allocation error\n");
exit(EXIT_FAILURE);
}
}
argument = strtok(NULL, DELIM);
}
argumentlist[position] = NULL; //null terminates list of arguments
return argumentlist; //array of arguments
}
所以我现在有一个包含令牌的数组。现在的问题是我想将这个令牌数组拆分成更小的数组,以便使用shell命令。例如,如果有人输入:" ls -l |排序"我需要两个数组;一个带有令牌:" ls -l NULL"另一个用"排序NULL" ==>
token1[0] = ls
token1[1] = -l
token1[2] = NULL
token2[0] = sort
token2[1] = NULL
我需要execvp命令的这些数组。或者如果有人输入:" ls -l< test.txt> hello.txt的"我应该使用令牌获得两个数组:" ls -l NULL"和" test.txt hello.txt NULL"。所以我想创建一个函数,它接受一个char **并通过查找">"来创建令牌数组。 "<"或" |"作为界定。
我希望这是不可思议的,我真的有点卡住我不知道如何继续前进而不会产生内存泄漏。