1

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

  1. 退格/删除
  2. 项目清单
  3. 左/右箭头键(移动光标前后插入文本)

例如在 windows 中使用 std::cin 时(例如:std::cin >> s;),它允许使用箭头键,但是在 linux 上使用相同的代码时,箭头键被假定为输入的一部分,光标不会四处移动。

我知道提供此类功能的各种 TUI 框架,例如 curses 和 ncurses,但它们超出了要求。

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

4

2 回答 2

1

退格和删除之类的事情通常由系统处理;当您从终端读取时,您只会在用户按下回车时获得输入。

系统所做的通常是相当有限的。特别是,我不知道有什么可以完成文件名完成之类的事情。如果需要的不仅仅是系统所做的,我建议查看readline许多 GNU 程序(bash、gdb 等)使用的库。它与使用它的应用程序分开提供。(两个小警告:我不知道它对本机 Windows 的支持有多好,而且我不确定它属于哪个许可证:GPL 或 LGPL。)

于 2013-05-01T08:03:58.880 回答
0

对于 Linux, readline 是一个不错的选择,但它是 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
}
于 2013-05-01T11:54:04.323 回答