解析该行在本地开发的shell中无法正常工作

时间:2018-04-12 22:42:50

标签: c

我尝试创建Linux shell并遇到问题,我读取用户输入,将其存储在字符串数组中,对其进行标记,以及我所拥有的任何条件args [0]永远不会成立。这是代码

void shell_loop(void)
{
    char *line;
    char **args;
    int status;

    do
    {
        printf("%s","sh1>");
        line=read_line();
        args=parse_line(line);
        status=execute_arguements(args);
    } while(status);
}

char * read_line(void)
{
    char * line=NULL;
    int bufferSize=MAX_SIZE;
    getline(&line,&bufferSize,stdin);
    return line;
}

char ** parse_line(char * line)
{
    int position=0;
    char ** tokens=malloc(MAX_SIZE*sizeof(char*));
    char * token;

    if(!tokens)
    {
        fprintf(stderr,"failed to allocate memory\n");
        exit(EXIT_FAILURE);
    }

    token=strtok(line," ");

    while (token != NULL) {
    tokens[position] = token;
    position++;
    token=strtok(NULL," ");
    }
    tokens[position] = NULL;
    return tokens;
}

int execute_arguements(char ** args)
{
    if (args[0] == NULL)
    {
    return 1;
    }

    printf("%s\n",args[0]);

    if(args[0]=="exit" || args[0]=="^D")
    {
        exit(EXIT_FAILURE);
    }

  return 1;

}

无论我在if语句中写什么条件它都不起作用,例如,如果我写exit或Ctrl + D没有任何反应,因为if永远不会成立。如果我只按enter args [0] == NULL为false,如果我按退出args [0] =="退出"即使是prinf也是假的("%s",args [0])打印退出例如。有人知道为什么会这样吗?提前致谢

1 个答案:

答案 0 :(得分:1)

我从评论中看到,您已经将user3121023的建议用于strcmp()而不是'=='进行字符串比较。这是第一个问题。

您无法通过与control-D进行比较来测试输入结束。 Control-D是用户可以(根据选项)在输入上发出文件结束信号的方式。但是这个角色并没有作为输入的一部分传达;而是关闭输入流。相反,您需要在getline()的调用中检查文件结尾,并相应地重新构建其余部分。

最有可能的原因strcmp()不匹配是因为getline返回的输入以换行符结尾。您的read_line()函数可能应该从行尾删除任何换行符。

请参阅http://man7.org/linux/man-pages/man3/getline.3.html