忽略“cin”并使用“kbhit”转到另一个函数

时间:2011-04-09 03:37:35

标签: c++ keyboard event-handling

我需要更多使用C ++的帮助, 让我们说我不知道​​我多大了,我想回到“功能2”按ESC。 我想要一些东西,当我按下ESC(不重要的时候)它忽略了“cin”并转到“function2”。 (我知道我不需要所有的图书馆)

#include <iostream>
#include <math.h>
#include <windows.h>
#include <fstream>
#include <cstdlib>
#include <string>
#include <sstream>
# include <conio.h>
using namespace std;


int function2();
float a, c;

int main(){

do {
    while (kbhit()) 
    {c = getch();}

    if (c==27)
    {function2();}

    cout << "How old are you?\t" << c << endl;
    cin>>a;


    } while(c != 27);}


int function2(){
    cout<< "!!!END!!!\n";
    return 0;
}

3 个答案:

答案 0 :(得分:1)

conio.h是一个已弃用且非标准的C库。要从输入中获取字符,您必须通过cin(例如cin.get()),或使用系统相关的功能,在这种情况下,您需要查看提供的库使用适合您平台的编译器。如果可用,请尝试getch()(另一种非便携式功能)。

At this site您可以找到有关如何实施所需内容的几个示例。

答案 1 :(得分:0)

conio.h不提供任何异步I / O信令的方法。 (更重要的是,conio.h甚至不是C或C ++标准的一部分。我不建议尝试在Mac或Linux上使用它。)您需要实现自己的输入系统(基本上重写{{使用istream::operator >>在特殊键上分支1}}或可笑的危险gets。我建议重新考虑你的输入设计,因为即使产生第二个线程来观看getch(我假设你在Windows上),也不会轻易在另一个线程上中断GetKeyState。 / p>

答案 2 :(得分:0)

除了conio.h之类的内容之外,原始代码的另一个问题是您正在测试针对整数的浮点数

if (c==27)
鉴于您的输入需要字符,您应该使用char(或整数)类型(忽略可能的UTF-16键盘代码,鉴于您在Windows上,很可能)。

对于与平台无关的代码,您可能需要以下内容:

#include <iostream>
int function2();
int c;
int main(){
  do {
    cin >> c;
    if (c == 27) {
      function2();
    }
    cout << "How old are you?" << endl;

  } while (c != 27);
  return 0;
}

int function2() {
  cout << "!!!END!!!" << endl;
  return 0;
}

当然,这种方法存在问题 - 对于正确的事件处理,您需要在WinAPI中使用函数GetKeyState。