Подтвердить что ты не робот

Как имитировать "Нажмите любую клавишу, чтобы продолжить?"

Я пытаюсь написать программу на С++, в которой пользователь вводит любой символ с клавиатуры и должен перейти к следующей строке кода.

Вот мой код:

char c;

cin>>c;

cout<<"Something"<<endl;

но это не работает, потому что он только переходит к следующей строке, когда я ввожу какой-то символ, а затем нажмите ENTER.

ИЛИ

Если я использую этот

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

он переходит к следующей строке инструкции, когда я нажимаю Enter.

Но я хотел, чтобы он перешел к следующей строке на любой клавише, нажатой на клавиатуре, как это можно сделать?

4b9b3361

Ответ 1

Если вы работаете в Windows, вы можете использовать kbhit(), который является частью библиотеки времени выполнения Microsoft. Если вы работаете в Linux, вы можете реализовать kbhit таким образом (источник):

#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>

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). Этот gist можно сохранить как kbhit.c и скомпилировать как на Linux, так и на OS X с помощью

gcc -o kbhit kbhit.c

При запуске с

./kbhit

Он предлагает вам нажать клавишу и выйдет, когда вы нажмете клавишу (не ограничиваясь клавишами "Enter" или "Печать" ).

@Johnsyweb - пожалуйста, уточните, что вы подразумеваете под "подробным каноническим ответом" и "всеми проблемами". Кроме того, перекрестная платформа: с этой реализацией kbhit() вы можете иметь ту же функциональность в программе на С++ в Linux/Unix/OS X/Windows - на каких других платформах вы можете ссылаться?

Дальнейшее обновление для @Johnsyweb: Приложения С++ не живут в герметично закрытой среде С++. Большой причиной успеха С++ является совместимость с C. Все основные платформы реализованы с помощью C-интерфейсов (даже если внутренняя реализация использует С++), поэтому ваши разговоры о "наследии" кажутся неуместными. Кроме того, поскольку мы говорим об одной функции, зачем вам С++ для этого ( "C с классами" )? Как я уже указывал, вы можете писать на С++ и легко обращаться к этой функции, и пользователям вашего приложения вряд ли понравится, как вы его реализовали.

Ответ 2

В Windows:

system("pause");

и на Mac и Linux:

system("read");

выводит "Нажмите любую клавишу, чтобы продолжить..." и, очевидно, дождитесь нажатия любой клавиши. Надеюсь, что вы имели в виду

Ответ 3

Нет полностью портативного решения.

В вопросе 19.1 comp.lang.c FAQ подробно описывается это с помощью решений для Windows, Unix-подобных систем и даже MS-DOS и VMS.

Быстрое и неполное резюме:

  • Вы можете использовать библиотеку curses; вызов cbreak(), за которым следует getch() (не путать с функцией getch() для Windows). Обратите внимание, что curses обычно управляет терминалом, поэтому это, вероятно, будет чрезмерным.
  • Возможно, вы сможете использовать ioctl() для управления настройками терминала.
  • В POSIX-совместимых системах tcgetattr() и tcsetattr() могут быть лучшим решением.
  • В Unix вы можете использовать system() для вызова команды stty.
  • В MS-DOS вы можете использовать getch() или getche().
  • В VMS (теперь называемом OpenVMS) подпрограммы управления экранами (SMG$) могут сделать трюк.

Все эти C-решения должны работать одинаково хорошо в С++; Я не знаю ни одного специального решения на С++.

Ответ 4

Для достижения этой функциональности вы можете использовать библиотеку ncurses, которая была реализована как в Windows, так и в Linux (и MacOS, насколько мне известно).

Ответ 5

Я посмотрел, чего вы пытаетесь достичь, потому что я помню, что хотел сделать то же самое. Вдохновленный Vinay Я написал что-то, что работает для меня, и я понимаю. Но я не эксперт, поэтому, пожалуйста, будьте осторожны.

Я не знаю, как Винай знает, что вы используете Mac OS X. Но он должен работать примерно так, как в большинстве UNIX-подобных ОС. Действительно полезно как ресурс opengroup.org

Перед использованием функции убедитесь, что вы сбросили буфер.

#include <stdio.h>
#include <termios.h>        //termios, TCSANOW, ECHO, ICANON
#include <unistd.h>     //STDIN_FILENO


void pressKey()
{
    //the struct termios stores all kinds of flags which can manipulate the I/O Interface
    //I have an old one to save the old settings and a new 
    static struct termios oldt, newt;
    printf("Press key to continue....\n");

    //tcgetattr gets the parameters of the current terminal
    //STDIN_FILENO will tell tcgetattr that it should write the settings
    // of stdin to oldt
    tcgetattr( STDIN_FILENO, &oldt);
    //now the settings will be copied 
    newt = oldt;

    //two of the c_lflag will be turned off
    //ECHO which is responsible for displaying the input of the user in the terminal
    //ICANON is the essential one! Normally this takes care that one line at a time will be processed
    //that means it will return if it sees a "\n" or an EOF or an EOL
    newt.c_lflag &= ~(ICANON | ECHO );      

    //Those new settings will be set to STDIN
    //TCSANOW tells tcsetattr to change attributes immediately. 
    tcsetattr( STDIN_FILENO, TCSANOW, &newt);

    //now the char wil be requested
    getchar();

    //the old settings will be written back to STDIN
    tcsetattr( STDIN_FILENO, TCSANOW, &oldt);

}


int main(void)
{
  pressKey();
  printf("END\n");
  return 0;
}

O_NONBLOCK также является важным флагом, но это ничего не меняет для меня.

Я ценю, если бы люди с более глубокими знаниями прокомментировали бы это и давали бы некоторые советы.

Ответ 6

Вы можете использовать специфичную для Microsoft функцию _ getch:

#include <iostream>
#include <conio.h>
// ...
// ...
// ...
cout << "Press any key to continue..." << endl;
_getch();
cout << "Something" << endl;

Ответ 7

Это очень просто. Я сделал программу, и она отлично работает. Вот программа.

#include<iostream.h>
#include<conio.h>

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();
}

Ответ 8

Это работает на платформе Windows: Он использует микропроцессорные регистры напрямую и может использоваться для проверки нажатия клавиши или кнопки мыши

    #include<stdio.h>
    #include<conio.h>
    #include<dos.h>
    void main()
    {
     clrscr();
     union REGS in,out;
     in.h.ah=0x00;
     printf("Press any key : ");

     int86(0x16,&in,&out);
     printf("Ascii : %d\n",out.h.al);
     char ch = out.h.al;
     printf("Charcter Pressed : %c",&ch);
     printf("Scan code : %d",out.h.ah);
     getch();
    }

Ответ 9

Если вы используете Visual Studio 2012 или старше, используйте функцию "getch()", если вы используете Visual Studio 2013 или новее, используйте "_getch()". Вам нужно будет использовать "#include < conio.h > ". Пример:

#include "stdafx"
#include <iostream>
#include <conio.h>

int main()
{
   std::cout << "Press any key to continue. . .\n"
   _getch() //Or "getch()"
}

Ответ 10

Вы можете использовать getchar.

Из приведенной выше ссылки:

/* getchar example : typewriter */
#include <stdio.h>

int main ()
{
  char c;
  puts ("Enter text. Include a dot ('.') in a sentence to exit:");
  do {
    c=getchar();
    putchar (c);
  } while (c != '.');
  return 0;
}

Ответ 11

Также вы можете использовать getch() из conio.h. Точно так же:

...includes, defines etc
void main()
{
//operator
getch(); //now this function is waiting for any key press. When you have pressed its     just     //finish and next line of code will be called
}

Итак, поскольку UNIX не имеет conio.h, мы можем имитировать getch() этим кодом (но этот код уже написан Vinary, мой сбой):

#include <stdio.h>
#include <termios.h>
#include <unistd.h>

int mygetch( ) {
  struct termios oldt,
             newt;
  int            ch;
  tcgetattr( STDIN_FILENO, &oldt );
  newt = oldt;
  newt.c_lflag &= ~( ICANON | ECHO );
  tcsetattr( STDIN_FILENO, TCSANOW, &newt );
  ch = getchar();
  tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
  return ch;
}

Ответ 12

#include <iostream>
using namespace std;

int main () {
    bool boolean;
    boolean = true;

    if (boolean == true) {

        cout << "press any key to continue";
        cin >> boolean;

    }
    return 0;
}

Ответ 13

Вы можете использовать переменную Scanner и использовать метод HasNext(). Затем сломайте его и выйдите с помощью функции exit();

import java.util.Scanner;

    public class exit_onClick {
        public static int exit()
        {
            return 0;
        }
        public static void main(String[] args) {
            Scanner scan = new Scanner(System.in);
            System.out.println("Press Any Key to EXIT....");
            int c=0;
            while(scan.hasNext())
            {
                c++;
                if(c==1)
                    break;
            }
            exit();
        }

    }

Ответ 14

Если теперь вы посмотрите функцию kbhit() на MSDN, она говорит, что функция устарела. Вместо этого используйте _kbhit().

#include <conio.h>
int main()
{
    _kbhit();
    return 0;
}

Ответ 15

Просто используйте команду system("pause");.

Все остальные ответы более сложны.