Игнорирование «cin» и использование «kbhit» для перехода к другой функции - PullRequest
1 голос
/ 09 апреля 2011

Мне нужна дополнительная помощь с использованием C ++. Допустим, я не знаю, сколько мне лет, и я хочу вернуться к «function2», нажав 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 ]

1 голос
/ 09 апреля 2011

conio.h является устаревшей и нестандартной C-библиотекой.Чтобы получить символ из ввода, вы должны пройти через cin (например, cin.get()) или использовать системно-зависимую функциональность, в этом случае вам нужно будет посмотреть библиотеки, поставляемые с вашим компилятором, дляваша платформа.Попробуйте getch(), если он доступен (другая непереносимая функция).

На этом сайте вы можете найти несколько примеров того, как реализовать то, что вам нужно.

0 голосов
/ 09 апреля 2011

Помимо того, что было упомянуто с conio.h и т. П., Еще одна проблема с вашим исходным кодом заключается в том, что вы тестируете операции с числами типа int, например

if (c==27)
Учитывая, что в вашем вводе ожидаются символы, вы должны использовать тип char (или integer) (игнорируя возможные коды клавиатуры 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;
}

Конечно, есть проблемы с этим подходом - для правильной обработки событий вам нужно использовать функции GetKeyState из WinAPI.

0 голосов
/ 09 апреля 2011

conio.h не предоставляет никаких средств сигнализации асинхронного ввода-вывода. (Более того, conio.h даже не является частью стандартов C или C ++. Я не рекомендую пытаться использовать его на Mac или Linux.) Вам необходимо реализовать собственную систему ввода (в основном, переписать istream::operator >> или до смешного опасного gets) для перехода по специальным ключам с помощью getch. Я рекомендую переосмыслить ваш дизайн ввода, поскольку даже создание второго потока для просмотра GetKeyState (я полагаю, что вы работаете в Windows) с запоздалым дыханием не сможет легко прервать getline в другом потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...