在get_line实现中,如何允许用户移动光标?

时间:2018-04-02 19:38:22

标签: c shell getline stdio

所以,我现在正在研究一个小壳 我通过自己的getline实现获得用户输入,该实现重复调用fgetc(stdin)并重新分配以读取一行。

如何让用户使用左右键将光标移动到他当前正在写入的输入中?

功能:

#define LINE_BUFSIZE 256
static char *get_line(void)
{
    char  *line   = malloc(LINE_BUFSIZE);
    char  *linep  = line;
    size_t lenmax = LINE_BUFSIZE;
    size_t len    = lenmax;
    int    c;

    if (!line)
        return NULL;

    for (;;) {
        c = fgetc(stdin);
        if (c == EOF)
            break;

        if (--len == 0) {
            len = lenmax;
            lenmax *= 3;
            lenmax /= 2;
            char *linen = realloc(linep, lenmax);

            if (!linen) {
                free(linep);
                return NULL;
            }

            line  = linen + (line - linep);
            linep = linen;
        }

        if ((*line++ = c) == '\n')
            break;
    }
    *line = '\0';
    return linep;
}

1 个答案:

答案 0 :(得分:2)

基本上有三种方法可以做到这一点。按努力降序:

  1. 将终端置于原始模式以便能够接收诸如Ctrl-B等字符,然后处理它们。真的,除非你愿意花费大量时间(除非是为了学习),否则不要重新发明轮子。不要去那里。
  2. 由于已经解决了一百次,并且许多程序需要这种程序,因此开发了一个名为 termcap 的库来抽象终端功能。如果您希望您的程序不仅可以在xterm中运行,而且还可以在其他终端上运行,那么这就是您的选择。
  3. 使用GNU readline 库。从其手册:

    #include <stdio.h>
    #include <readline/readline.h>
    #include <readline/history.h>
    
    char *
    readline (const char *prompt);
    
  4.   

    说明

         

    readline将从终端读取一行并使用提示返回      作为提示。如果prompt为NULL或空字符串,则不提示      发行。返回的行分配有malloc(3);来电者必须      完成后free。返回的行有最后的换行符      删除,所以只剩下该行的文本。

         

    readline在用户输入时提供编辑功能      线。默认情况下,行编辑命令类似于      emacs的。还有一个vi风格的线编辑界面。