2

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

3 回答 3

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;
}
于 2011-04-07T20:44:21.737 回答
0

您还没有为它分配任何内存char **arguments- 它只是一个悬空指针。

于 2011-04-07T20:43:26.483 回答
0

char **arguments是单个指针。考虑它指向的地方......

提示:它应该指向一个有用的地方,它可以容纳多个指针。

于 2011-04-07T20:43:51.203 回答