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的东西,如果有错请指正。