首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将char **数据类型转换为可以在c中打印的类型?

如何将char **数据类型转换为可以在c中打印的类型?
EN

Stack Overflow用户
提问于 2019-10-08 03:41:54
回答 1查看 84关注 0票数 0

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

但我无论如何也想不出如何打印输入的命令。

我声明了一个数组,尝试使用scanf,尝试从char **转换为char *,或者int;我暴力强制它的所有尝试都不起作用。

代码如下:

代码语言:javascript
运行
复制
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;
}

我收到的一些错误:"assignment makes from pointer wint a cast -wint-conversion“

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

"1value需要作为赋值的左操作数“

我只是有点迷惑。我相信有一个优雅的解决方案,我只是没有足够的经验来解决它。

EN

Stack Overflow用户

回答已采纳

发布于 2019-10-08 04:05:27

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

代码语言:javascript
运行
复制
printf("%s", arg);

使用

代码语言:javascript
运行
复制
printf("%s", command[0]);

它应该做到这一点。

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

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

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

代码语言:javascript
运行
复制
if (command[0]=="quit")

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

代码语言:javascript
运行
复制
strcmp(command[0], "quit");

如果字符串相等,则返回0,否则返回不同于0的值。

票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58276156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档