Как имитировать "Нажмите любую клавишу, чтобы продолжить?"
Я пытаюсь написать программу на С++, в которой пользователь вводит любой символ с клавиатуры и должен перейти к следующей строке кода.
Вот мой код:
char c;
cin>>c;
cout<<"Something"<<endl;
но это не работает, потому что он только переходит к следующей строке, когда я ввожу какой-то символ, а затем нажмите ENTER.
ИЛИ
Если я использую этот
cin.get() or cin.get(c)
он переходит к следующей строке инструкции, когда я нажимаю Enter.
Но я хотел, чтобы он перешел к следующей строке на любой клавише, нажатой на клавиатуре, как это можно сделать?
Ответы
Ответ 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");
.
Все остальные ответы более сложны.