gpt4 book ai didi

c - 在 C 中标记化命令行输入

转载 作者:太空宇宙 更新时间:2023-11-03 23:35:18 28 4
gpt4 key购买 nike

尝试获取一行文本并将其标记为文件名和 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com