myshell中readline的使用

readline.h

readline.h这个库需要大家自己安装,他有许多功能这里也只是一些皮毛,下面是下载readline库的地方,下载后你需要将它解压到include目录中。由于readline是一个动态库,编译的时候需要加上 -lreadline,不然会找不到相关的函数。
readline

readline函数

tab补全需要使用readline这个函数,该函数的原型为:

char *readline(const char *prompt);

功能
readline将会从终端读取一行数据(读到\n结束)然后返回,被返回的数据的存储内存是通过malloc()函数分配的,所以每次使用完都,当使用完毕后都应当free掉。同时该函数还具有光标移动功能,此功能下面会仔细讲解。

返回值
该函数会返回你输入的字符串,但当prompt没有指向任何地方时,该函数会输出一次返回的字符串。

让我们来看看下面两个例子来深入了解一下readline函数:
text1.c

1#include <stdio.h>
#include <readline/readline.h>
#include <readline/history.h>

int main()
{
    while(1)
    {
        char *str;          //没有指向任何地方
        str = readline(str);
        printf("%s\n", str);
        if(strcmp(str, "exit") == 0)
        {
            //输入exit退出程序
            break;
        }
    }
}

运行结果:
输入:ls
输出:ls       //这个ls由printf输出有\n,下一个是readline输出没有\n
     ls|<-----光标在此处

text2.c

#include <stdio.h>
#include <readline/readline.h>
#include <readline/history.h>

int main()
{
    while(1)
    {
        char *str = NULL;
        str = readline(str);
        printf("%s\n", str);
        if(strcmp(str, "exit") == 0)
        {
            //输入exit退出程序
            break;
        }
    }
}

运行结果
输入:ls
输出:ls              //由printf输出有换行
     |<---光标在ls的下一行printf的\n的作用

text3.c

#include <stdio.h>
#include <readline/readline.h>
#include <readline/history.h>

int main()
{
    while(1)
    {
        char *str = "myshell:$";
        str = readline(str);
        printf("%s\n", str);
        if(strcmp(str, "exit") == 0)
        {
            //输入exit退出程序
            break;
        }
    }
}

运行结果
输入:myshell:$ls       //myshell:$为readline函数输出显示,ls为键盘输入
输出:ls                //由printf输出
     myshell:$|<-------光标移动到此处

tab补全

其实readline函数自带tab补全功能,它会在当前目录下寻找文件补全,不补全命令,只不=补全文件。

光标移动

readline函数也支持光标移动。但你可能会遇到下面一些问题:

#include <stdio.h>
#include <readline/readline.h>
#include <readline/history.h>

int main()
{
    while(1)
    {
        char *str = NULL;
        printf("myshell:$");
        str = readline(str);
        printf("%s\n", str);
        if(strcmp(str, "exit") == 0)
        {
            //输入exit退出程序
            break;
        }
    }
}

运行结果
输入:myshell:$ks -l shell.c

如果我把ls打成了ks,可以用左右键将光标移动至k后,但当你按下backspace时所达到的效果并不是我们想要的,我也不太清楚为什么,你知道可以告诉我一下,但我们可以用下面方法来解决他

#include <stdio.h>
#include <readline/readline.h>
#include <readline/history.h>

int main()
{
    while(1)
    {
        char *str = "myshell:$";
        str = readline(str);
        /*
        前两句代码替换成下面两句也一样
		char *str = NULL;
		str = readline("myshell:$");
		*/
        printf("%s\n", str);
        if(strcmp(str, "exit") == 0)
        {
            //输入exit退出程序
            break;
        }
    }
}

这次你再遇到刚刚的问题时就会达到你想要的效果了。

add_history函数

如果你向用上下键来查找历史命令,这个函数可以帮到你。该函数的原型为:

void add_history(const char *prompt);

该函数会将字符串作为参数存入历史文件中。下面代码简单实现了上下键切换历史记录。


#include <stdio.h>
#include <stdlib.h>
#include <readline/readline.h>
#include <readline/history.h>

int main()
{
    while(1)
    {
        char *str = "myshell:$";
        str = readline(str);
        printf("%s\n", str);
        if(strcmp(str, "exit") == 0)
        {
            //输入exit退出程序
            break;
        }
        if(str && *str)
        {
            add_history(str);
        }
        free(str);
    }
}

这只是我总结的一些关于readline的东西,如果有错请指正。

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值