尝试获取一行文本并将其标记为 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);
最佳答案
对 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;
}
关于c - 在 C 中对命令行输入进行标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5587365/