2013-09-14 2 views
17

Как создать функцию void, которая будет работать как «Нажать любую клавишу для продолжения» в программировании на C?Функция «Нажать любую клавишу для продолжения» в C

То, что я хочу сделать, это:

printf("Let the Battle Begin!\n"); 
printf("Press Any Key to Continue\n"); 
//The Void Function Here 
//Then I will call the function that will start the game 
+3

какая платформа? окна? линукс? макинтош? – qwertz

+1

В другом (более позднем) комментарии компилятор заявлен как VS2012, что означает Windows. –

ответ

31

Использование функции стандартной библиотеки C getchar(), getch() функция boreland не стандартная.

используется только в окне TURBO C.

printf("Let the Battle Begin!\n"); 
printf("Press Any Key to Continue\n"); 
getchar();  

следует нажать клавишу возврата здесь. для этого оператор printf должен нажать ENTER для продолжения.

Если вы нажмете a, вам нужно снова нажать ENTER.
Если вы нажмете ENTER, он продолжит нормально.

по этой причине, он должен быть

printf("Let the Battle Begin!\n"); 
printf("Press ENTER key to Continue\n"); 
getchar();  

Если вы используете окна, то вы можете использовать getch()

printf("Let the Battle Begin!\n"); 
printf("Press Any Key to Continue\n"); 
getch(); 
//if you press any character it will continue , 
//but this is not a standard c function. 

char ch; 
printf("Let the Battle Begin!\n"); 
printf("Press ENTER key to Continue\n");  
//here also if you press any other key will wait till pressing ENTER 
scanf("%c",&ch); //works as getchar() but here extra variable is required.  
+2

Я могу нажать 20000 клавиш, и если ни один из них не является клавишей возврата (или клавишей «Любой» ;-), я не могу продолжить. Это не будет правильным решением для этого конкретного случая. –

+2

Я понимаю это. Это было преувеличением. Моя точка зрения заключалась в том, что клавиша Return должна быть нажата, то есть независимо от того, сколько ключей вы нажимаете, если ни один из них не является клавишей Return, есть проблема, потому что вы должны иметь возможность нажимать одну клавишу, независимо от того, какой ключ и программа должна продолжаться. –

+0

@ChronoKitsune действительно упомянуть об этом info.helpful comment [+1] .thanks для указания этого. – Gangadhar

3

Использование getch():

printf("Let the Battle Begin!\n"); 
printf("Press Any Key to Continue\n"); 
getch(); 

альтернатива Windows, должна быть _getch().

Если вы используете Windows, то это должно быть полным пример:

#include <conio.h> 
#include <ctype.h> 

int main(void) 
{ 
    printf("Let the Battle Begin!\n"); 
    printf("Press Any Key to Continue\n"); 
    _getch(); 
} 

P.S. поскольку @Rörd отметил, что если вы находитесь в системе POSIX, вам нужно убедиться, что библиотека curses настроена правильно.

+1

getch не находится в POSIX. –

+0

@ Рёрд, ты прав, моя ошибка! –

+0

Это также означает, что если вы находитесь в системе POSIX, вам нужно будет правильно настроить проклятия, прежде чем вы сможете использовать 'getch'. –

1

Попробуйте это: -

printf("Let the Battle Begin!\n"); 
printf("Press Any Key to Continue\n"); 
getch(); 

getch() используется, чтобы получить символ из консоли, но не эхо на экран.

+0

Visual Studio 2012 (программа, которую я использую для кода C) утверждает, что getch() не определено. –

+0

Я использую , и

+0

Вы пытались использовать getchar() ?? –

11

Вы не говорите, что которую вы используете, но поскольку у вас уже есть какой-то answe rs, который может работать или не работать для Windows, я отвечу на POSIX-системы.

В POSIX ввод с клавиатуры происходит через нечто, называемое терминальным интерфейсом, который по умолчанию буферизует линии ввода до тех пор, пока не будет нажата кнопка Return/Enter, чтобы правильно работать с backspace. Вы можете изменить это с вызовом tcsetattr:

#include <termios.h> 

struct termios info; 
tcgetattr(0, &info);   /* get current terminal attirbutes; 0 is the file descriptor for stdin */ 
info.c_lflag &= ~ICANON;  /* disable canonical mode */ 
info.c_cc[VMIN] = 1;   /* wait until at least one keystroke available */ 
info.c_cc[VTIME] = 0;   /* no timeout */ 
tcsetattr(0, TCSANOW, &info); /* set immediately */ 

Теперь, когда вы читаете из стандартного ввода (с getchar(), или любым другим способом), он будет возвращать символы немедленно, не дожидаясь возвращения/Enter. Кроме того, backspace больше не будет работать, вместо того, чтобы стирать последний символ, вы будете читать фактический символ обратного пробела на входе.

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

+1

+1, хотя вам может понадобиться предоставить код для возврата в канонический режим ... Единственная функция, которая включает ваш код, получает нажатие клавиши и возврат в канонический режим будет гораздо более эффективным ответом, на мой взгляд. Тем не менее, это хороший вклад. –

+0

Вероятно, самый простой способ - сохранить копию немодифицированной структуры «информации», которую вы получаете от tcgetattr. Таким образом, вы можете просто вернуть его к тому, как это было раньше в конце вашей функции. – plugwash

+0

Я просто попробовал это, не прочитав весь комментарий, и кажется, что ничего не произойдет, если вы не восстановите канонический режим. Bash по-прежнему работает по назначению, поиск стрелок в истории bash, может писать команды и т. Д.Также, вероятно, открытие нового терминала получает настройки по умолчанию в любом случае. – bone

Смежные вопросы