【问题标题】:How to read symbols until ESC button is pressed from cin in C++如何在 C++ 中的 cin 按下 ESC 按钮之前读取符号
【发布时间】:2013-10-16 13:01:21
【问题描述】:

我需要让我的while 循环工作,直到按下键盘上的 ESC 按钮。

char choose = NULL;
while( choose != 27)
{
    cout << "Choose (s), (e) or (n): ";
    cin.ignore();
    choose = cin.get();

    switch(choose){
    case 's': {SortRoutesByStartPoint(routeList, n); ShowRoutes(routeList, n, "Sorted list (s):"); break;}
    case 'e': {SortRoutesByEndPoint(routeList, n); ShowRoutes(routeList, n, "Sorted list (e):"); break;}
    case 'n': {SortRoutesByNumber(routeList, n); ShowRoutes(routeList, n, "Sorted list (n):"); break;}
    default: {cout << "Not found\n\n"; break;}
    }
}

但是当我按下 ESC 按钮时,它什么也没有发生。为什么?
如何让它发挥作用?

【问题讨论】:

  • stackoverflow.com/questions/14214753/… 可能重复?看看那个。
  • 是的,我已经看到了这个问题,并尝试使用其中的第一个答案,但它不起作用。
  • ESC 可能会被您的终端抓取,因此它永远不会出现在标准输入中。您可能必须设置一些终端设置才能获得这些按键 - 使用一些 TUI 库(如 CURSES)可能会更好地为您处理这些东西。

标签: c++ input cin


【解决方案1】:

简单的答案是你不能,至少不可靠, 使用标准流。如果您从 一个终端,你会得到操作系统给你的东西。总的来说,它 在按下输入之前不会给你任何东西,并且 去掉很多字符用于行编辑和其他事情 在那之前; ESC是其中一个明显的变化 字符。

当你想逐字符阅读时(显然你 做),你需要一些第三方库,比如curses。或者你会有 自己写很多系统依赖的代码。

【讨论】:

    【解决方案2】:
    #include <conio.h>
    
    cout << "Choose (s), (e) or (n): ";
    // cin.ignore();
    // choose = cin.get();
    
    choose =getche();
    if(choice==0)  //an extended character code is next
      choice=getche();
    

    【讨论】:

    • 当然 conio.hgetche 不是 ISO C++ 的一部分,所以 James Kanze 的回答仍然成立。
    猜你喜欢
    • 2012-12-22
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 2016-12-31
    • 2013-12-01
    • 1970-01-01
    • 2022-01-24
    • 2011-12-02
    相关资源
    最近更新 更多