在C中使用Tokenize命令行输入

时间:2011-04-07 20:40:56

标签: c solaris strtok

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

3 个答案:

答案 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是一个单指针。考虑它指向的地方......

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