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

标签 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);

最佳答案

对 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/

相关文章:

c++ - 如果用新版本覆盖共享库(当前由程序映射)会发生什么?

mysql - PDO异常 : SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in lock_may_be_available()

c - 使用 strtok() 将字符串拆分为字符串不起作用

C Webvserver – STDIN、套接字和 CGI​​ 管道

c - C-此指针为空吗?

c++ - 返回一个 long long 值

c - parent 试图读取 child 退出状态(或返回值), fork 并等待

c++ - Solaris 上 timegm 的替代品

c - 从字符串中标记字符串时出错

c - 使用 fgets() 和 strtok() 以逗号分隔符读取文件