尝试获取一行文本并将其标记为execvp()
的文件名和参数。这是我的代码,getArguments()
是破碎的功能。目前,尝试打印arguments[0]
会导致总线错误。
char* getFilename(char* input) {
return strtok(input, " &");
}
char** getArguments(char* input) {
char** arguments;
int k = 0;
char* tokenized;
tokenized = strtok(input, " &");
tokenized = strtok(NULL, " &");
while (tokenized != NULL) {
arguments[k] = tokenized;
++k;
tokenized = strtok(NULL, " &");
}
return arguments;
}
我稍后会在我的代码中以下列方式使用它:
char* filename = getFilename(line);
char** arguments = getArguments(line);
答案 0 :(得分:2)
对getFilename的调用通过在第一个标记之后放置一个'\ 0'字符来修改字符串。然后尝试在getArguments的开头重新启动。这只会产生第一个令牌,因为现在字符串过早终止了。您可以通过删除getFilename并从getArguments获取它来解决此问题。
char **arguments = getArguments(line);
char *filename = arguments[0];
此外,您必须为char **arguments;
数组中的每个指针分配空间。您可以使用realloc动态增长数组。但是,有更有效的方法。
char** getArguments(char* input) {
char** arguments;
int k = 0;
char* tokenized;
arguments = calloc(1, sizeof (char *));
tokenized = strtok(input, " &");
/* don't eat the first token here since we want the filename in arguments */
while (tokenized != NULL) {
arguments[k] = tokenized;
++k;
arguments = realloc(arguments, sizeof (char *) * (k + 1));
tokenized = strtok(NULL, " &");
}
/* an extra NULL is required to terminate the array for execvp() */
arguments[k] = NULL;
return arguments;
}
答案 1 :(得分:0)
你还没有为char **arguments
分配任何内存 - 它只是一个悬空指针。
答案 2 :(得分:0)
char **arguments
是一个单指针。考虑它指向的地方......
提示:它应该指向可以容纳多个指针的地方。