用于在C ++中管理控制台游标操作的简单且可移植的方法

时间:2013-05-01 06:48:06

标签: c++ console cursor cursor-position tui

当处理控制台输入(stdin,std :: cin)时,C ++中有一种可移植的方式来管理用户可能执行的各种操作:

  1. 退格/删除
  2. 列表项
  3. 左/右箭头键(移动光标前后插入文本)
  4. 例如在windows中使用std :: cin时(例如:std :: cin>> s;),它允许使用箭头键,但是当在linux上使用相同的代码时,会假设箭头键作为输入的一部分,光标不会移动。

    我知道各种TUI框架,比如提供此类功能的curses和ncurses,但它们不仅仅是所需的。

    我希望有一个基于标准库的简单解决方案,或者甚至是一个轻量级的开源库,它可能具有类似std :: getline的功能,可以在更流行的操作系统中移植。

2 个答案:

答案 0 :(得分:1)

退格和删除等内容通常由。处理 系统;当您从终端读取时,您只能获得输入 当用户按下回车键时。

系统的作用通常相当有限。特别是, 我不知道有任何文件名完成之类的事情。 如果超过系统所需要的,我会建议 查看许多GNU程序使用的readline库 (bash,gdb等)。它可以单独购买 使用它的应用程序。 (两个小警告:我不知道 它对本机Windows的支持有多好,我不确定 它所属的许可证是:GPL或LGPL。)

答案 1 :(得分:0)

readline是Linux的不错选择,但它是GPL!我使用以下代码在Windows和Linux上编译:

#ifdef USE_READLINE
    #include <readline/readline.h>
    #include <readline/history.h>
#endif
...
void getline(char *buf)
{
    #ifdef USE_READLINE
            char *tmp;
            tmp = readline(PROMPT);
            if(strncmp(tmp, buf, MAXLENGTH)) add_history(tmp);      // only add new content
            strncpy(buf, tmp, MAXLENGTH);
            buf[MAXLENGTH]='\0';    
            free(tmp);
    #else
            std::cout<<PROMPT;
            std::cin.get(buf,MAXLENGTH);
            std::cin.ignore(); // delete CR
    #endif
}