当前位置:  开发笔记 > 编程语言 > 正文

如何模拟"按任意键继续?"

如何解决《如何模拟"按任意键继续?"》经验,为你挑选了5个好方法。

我正在尝试编写一个C++程序,当用户从键盘输入任何字符时,它应该移动到下一行代码.

这是我的代码:

char c;

cin>>c;

cout<<"Something"<

但这不起作用,因为当我输入一些字符然后按ENTER键时它只会移动到下一行.

要么

如果我用这个

cin.get() or cin.get(c)

按Enter键进入下一行指令.

但我希望它能够在键盘上按下的任何键上移动到下一行,如何做到这一点?



1> 小智..:

在Windows上:

system("pause");

在Mac和Linux上:

system("read");

将输出"按任意键继续...",显然,等待按任何键.我希望那就是你的意思


忘了慢,它调用第一个名为"pause"的程序,碰巧在PATH中找到它,并给它调用程序的权限级别.即使您是学生只是测试自己的代码,它仍然是一个巨大的安全风险.
没错,但它只有一条线!有时,将计算机保存一段时间是不值得的.
@XDfaceme - pause是system()要求windows运行的实际程序.但是,如果有另一个名为'pause'的程序,并且Windows首先找到该程序,它将运行它.我想我可能会过分夸大其重要性,但是使用cin.get()并点击返回以暂停/取消暂停程序仍然更容易
`system`调用外部程序.您无需调用外部程序等待任何密钥!就像打电话给另一个人在你坐在它前面打开电脑一样 - 这是一个缓慢的解决方案.

2> Vinay Sajip..:

如果您使用的是Windows,则可以使用kbhit()Microsoft运行时库中的一部分.如果您使用的是Linux,则可以实现kbhit(源代码):

#include 
#include 
#include 
#include 

int kbhit(void)
{
  struct termios oldt, newt;
  int ch;
  int oldf;

  tcgetattr(STDIN_FILENO, &oldt);
  newt = oldt;
  newt.c_lflag &= ~(ICANON | ECHO);
  tcsetattr(STDIN_FILENO, TCSANOW, &newt);
  oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
  fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);

  ch = getchar();

  tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
  fcntl(STDIN_FILENO, F_SETFL, oldf);

  if(ch != EOF)
  {
    ungetc(ch, stdin);
    return 1;
  }

  return 0;
}

更新:上述功能适用于OS X(至少在OS X 10.5.8 - Leopard上,所以我希望它可以在更新版本的OS X上运行).这个要点可以kbhit.c在Linux和OS X上保存和编译

gcc -o kbhit kbhit.c

在运行时

./kbhit

它会提示您输入按键,并在按键时退出(不限于Enter键或可打印键).

@Johnsyweb - 请详细说明"详细规范答案"和"所有问题"的含义.此外,重新"跨平台":通过这种实现,kbhit()您可以在Linux/Unix/OS X/Windows上的C++程序中具有相同的功能 - 您可能指的是其他平台?

@Johnsyweb的进一步更新: C++应用程序并不存在于密封的C++环境中.C++成功的一个重要原因是与C的互操作性.所有主流平台都是用C接口实现的(即使内部实现使用的是C++),所以你对"遗留"的讨论似乎不合适.另外,在我们讨论单个函数时,为什么需要C++("C with classes")?正如我所指出的,您可以使用C++编写并轻松访问此功能,而您的应用程序的用户不太关心您是如何实现它的.


@Johnsyweb:我知道RAII及其带来的好处,我自己就是一个古老的C++手.我的观点仍然存在:声明与幕后工作之间没有明确的联系.虽然它可能使用闪亮的C++习语而不是普通的旧C语言,但我的观点是它没有什么可以照亮的,而且很难掩盖正在发生的事情.这不是以任何方式针对您个人 - 这只是关于如何使用C++来创建不必要的难以理解的代码的意见.我现在会离开我的肥皂盒,"努夫说.

3> Keith Thomps..:

没有完全便携的解决方案.

comp.lang.c FAQ的问题19.1 涵盖了这个问题,包括Windows,类Unix系统甚至MS-DOS和VMS的解决方案.

快速而不完整的摘要:

你可以使用curses图书馆; 调用cbreak()后跟getch()(不要与Windows特定的getch()功能混淆).注意,curses通常控制终端,所以这可能是过度的.

您可以使用它ioctl()来操纵终端设置.

在POSIX兼容的系统,tcgetattr()并且tcsetattr()可能是一个更好的解决方案.

在Unix上,您可以使用它system()来调用stty命令.

在MS-DOS上,您可以使用getch()getche().

在VMS(现在称为OpenVMS)上,Screen Management(SMG$)例程可能会起作用.

所有这些C解决方案在C++中应该同样有效; 我不知道任何特定于C++的解决方案.



4> Kirill V. Ly..:

要实现此功能,您可以使用ncurses库,该库在Windows和Linux(以及据我所知的MacOS)上实现.


然后,唯一的选择是为您计划支持的每个操作系统实现所需的功能.

5> 小智..:

这很简单.我制作了一个程序,它的工作非常完美......这就是程序.

#include
#include

void  check()
{
    char chk; int j;
    cout<<"\n\nPress any key to continue...";
    chk=getch();
    j=chk;
    for(int i=1;i<=256;i++)
      if(i==j) break;
    clrscr();
}

void main()
{
    clrscr();
    check();
    cout<<"\n\nSee, Its Working....Have a Good day";
    getch();
}

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有