【问题标题】:How to convert a char ** data type to something that can be printed in c?如何将 char ** 数据类型转换为可以在 c 中打印的内容?
【发布时间】:2019-10-07 19:41:54
【问题描述】:

我的任务是创建一个嵌套的 Unix shell,它使用 fork/exec/wait 模型执行命令。其中一条指令指出,如果命令不存在(如“cd”,那么我需要打印尝试的命令。例如(如果输入是 cd,则输出是“cd: command not found.”)

但我终其一生都无法弄清楚如何打印输入的命令。

我声明了一个数组,尝试使用 scanf,尝试从 char ** 转换为 char * 或转换为 int;我尝试暴力破解它都没有奏效。

代码如下:


int main() {
        char **command;
        char *input;
        pid_t child_pid;
        int stat_loc;
        char arg[20];

        while (1)
        {
                input = readline("minor2> ");
                command = get_input(input);

                if(!command[0])
                {
                        free(input);
                        free(command);
                        continue;
                }
                else if(command[0]=="quit")
                {
                        exit(1);
                }

                child_pid = fork();
                if (child_pid == 0)
                {
                        /*Never returns if call is a success*/
                        execvp(command[0], command);
                        printf("%s", arg);
                        printf(": command not found.\n");
                }
                else
                {
                        waitpid(child_pid, &stat_loc, WUNTRACED);
                }

                free(input);
                free(command);
        }

char **get_input(char *input) {
    char **command = malloc(8 * sizeof(char *));
    char *separator = " ";
    char *parsed;
    int index = 0;

    parsed = strtok(input, separator);
    while (parsed != NULL) {
        command[index] = parsed;
        index++;

        parsed = strtok(NULL, separator);
    }

    command[index] = NULL;
    return command;
}

我收到的一些错误: “赋值从指针生成整数,无需强制转换-wint-conversion”

“转换为不同大小的整数指针”

“需要 1 个值作为赋值的左操作数”

我只是感到困惑。我确信有一个优雅的解决方案,只是我没有足够的经验来解决它。

【问题讨论】:

  • 什么是get_input?它有什么作用?你在哪里(如果在任何地方)定义它?您在哪里(如果在任何地方)声明它?请花一些时间刷新how to ask good questions,以及this question checklist。最后请不要忘记如何创建minimal reproducible example 向我们展示。
  • 为清晰起见编辑
  • 这一行没有意义:(char *) arg[20] = command arg[20] 超出了arg 数组的末尾,其类型为char。将其转换为 char * 会导致未定义的行为。
  • 那是我最后一次尝试获得可打印声明的尝试。它肯定没有用。
  • 我认为您需要退后几步,重新开始学习基本的 C 知识,因为您似乎错过了一些知识。

标签: c linux unix


【解决方案1】:

首先,您尝试将 arg 打印为命令名称,但我真的看不到您将任何内容分配给 arg 的位置,因此由于内存访问无效,打印可能随时中断(除非您点击0 解释为堆栈附近某处的 NULL 终止符)。你可以简单地替换

printf("%s", arg);

printf("%s", command[0]);

它应该这样做。

否则,您应该注意填充 arg 字符数组以保存命令名称。

我将编辑我的答案,因为我还可以看到另一个问题:

在 C 中,char * 是指向内存位置的指针,因此从技术上讲它只是一个整数。如果您尝试这样比较:

if (command[0]=="quit")

检查几乎总是会失败(在您的代码流中它总是会失败)。这是因为您比较了 2 个不同的内存地址,而您应该比较内存位置的内容。在 C 中比较 2 个字符串的正确方法是逐个字符进行比较,直到遇到 NULL 终止符。有一个函数可以做到这一点:

strcmp(command[0], "quit");

如果字符串相等则返回 0,否则返回非 0。

【讨论】:

    猜你喜欢
    • 2012-10-23
    • 1970-01-01
    • 2017-05-22
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多