2010-01-04 1 views
4

Я занимаюсь программированием на C для Linux для экзамена. Я не знаю, как выйти из программы, когда пользователь нажимает Ctrl + a (не Ctrl + c) Например, зацикливая что-то, пока пользователь не нажмет Ctrl + a Может ли кто-нибудь сказать мне, как проверить Ctrl + ввод?Продолжайте выполнение программы до тех пор, пока пользователь не наберет Ctrl + a

Примечания: Я использую «GCC» и запустить вывод с «./a.out»

Спасибо заранее для всех!

+1

Стандартный язык C не поддерживает опрос клавиатуры, поэтому вам нужно будет использовать что-то конкретное ОС. Я добавил тег linux, чтобы указать это. – 2010-01-04 12:32:38

+0

sidenote/некоторый код c, связанный с управлением ключами: http://retroforth.org/projects/darcs/TE/term.h – miku

+0

@Neil: Если вы не используете кроссплатформенную библиотеку – Draemon

ответ

3

Вы искали что-то вроде этого ??? эта программа не будет остановлена, так как вы нажмете Ctrl + A и Enter.

#include <stdio.h> 

int main() { 
    char a; 
    while(a!=1) //Ascii code for ctrl + A == 1 
    { 
     a=getchar(); 
     printf("still looping ...\n"); 
    } 
    printf("HA! You pressed CTRL+A\n"); 
    return 0; 
} 

Но если вы хотите прекратить вашу программу сразу после нажатия Ctrl + A (без удара ввести после этого), здесь вы:

#include <stdio.h> 
#include <ncurses.h> 

int main() { 
    char a; 
    initscr(); 
    raw(); 

    while(a!=1) 
     a=getch(); 

    endwin(); 
    return 0; 
} 

для компиляции второго кода с помощью GCC, попробуйте следующую команду:

gcc -o program.o -lncurses program.cpp 
+0

О, большое вам спасибо. Программа закрывается, когда я нажимаю Ctrl + a, но я не получаю сообщение «Ha! You ...» . Вопрос в том, почему программа завершает работу и почему «a» равна «1», когда я нажимаю Ctrl + a ? – Devyn

+0

Я не думаю, что это то, что ищет ОП. Его идея больше похожа на неблокирующий, асинхронный способ проверки ввода из STDIN. Подумайте об этом как Ctrl-a, генерируя сигнал и обрабатывая программу. Исправьте меня, если я ошибаюсь :) – user108127

+0

Управляющие символы возвращают ASCII-код, равный положению в алфавите, поэтому Ctrl + A = 1, Ctrl + C = 3, Ctrl + M = 13 (что, скорее всего, возврат каретки) , Ctrl + G = 7 (что, скажем, звонок или звуковой сигнал). –

2

Существует специальная поддержка для Ctrl-C, которая преобразуется в сигнал системы. Если вы хотите, чтобы ваша программа остановилась, как только будет использована другая конкретная комбинация клавиш, это будет намного сложнее.

  • вам нужно будет проверить стандартный ввод вашей программы, и вам нужно будет установить стандартный ввод поэтому входы не сохраняются в буфере (в противном случае вы не увидите вход до тех пор, пока не будет подтверждено пользователем нажатие «возврат»). Последняя часть будет выполнена с помощью вызова ioctl() и не будет переносимым;

  • вам потребуется либо тема или опрос, ни один из которых является очень вкусен в С.

Есть более интересные вещи, чтобы практиковать в С чем это.

+0

Я не уверен, почему downvotes. Что-то не так в этом ответе? –

+1

Я также не знаю, почему кто-то вас подавил. Спасибо за ответ в любом случае :) – Devyn

3

Turbo C и другие реализации C для Windows имели вызов функции getch(), который считывал бы отдельные символы с клавиатуры; те сделали бы то, что вы хотите.

В средах POSIX, таких как реализуемые gcc-скомпилированными программами под Unix/Linux, эта функциональность отсутствует.

Существует библиотека под названием curses, которая позволяет программам C выполнять полноэкранную обработку данных, а также функции getch() в проклятиях. Это может оказаться самым простым ответом на вашу проблему. Вам нужно будет прочитать документацию по проклятиям и связать файлы заголовков и библиотеки с вашей программой.

+1

Я нашел учебник для проклятий здесь http://docs.google.com/viewer?a=v&q=cache:ZfI2zzPOK4YJ:heather.cs.ucdavis.edu/~matloff/UnixAndC/CLanguage/Curses .pdf + c + library + curses & hl = en & sig = AHIEtbRrrVMOxF4CvfTHh6tTFtnRQtXctA – Xinus

0

Кто отправил первый с следующим кодом, который работает для меня, но я не знаю, почему он удалил свой ответ.

Оригинал Ссылка: http://www.c.happycodings.com/Gnu-Linux/code18.html

#include <stdio.h> 
#include <unistd.h> /* sleep(1) */ 
#include <signal.h> 

void ex_program(int sig); 

int main(void) { 
(void) signal(SIGINT, ex_program); 

while(1) 
    printf("sleeping .. ZZZzzzz ....\n"), sleep(1); 

return 0; 
} 

void ex_program(int sig) { 
printf("Wake up call ... !!! - Catched signal: %d ... !!\n", sig); 
(void) signal(SIGINT, SIG_DFL); 
} 
+0

Я удалил его, потому что еще не уверен CTRL + A, который создается с помощью Ctrl + a. –

+0

нет никакой разницы между ctrl + A и ctrl + a –

1

Это будет делать то, что вы хотите:

stty intr ^a 
./a.out 

Для дополнительного кредита, сделать эквивалент «Запущенная приемно^а» с помощью соответствующей функции библиотеки, например, «человек Термиос».

+0

Извините, Ричард, я не могу следовать за вами :(Я не программист. – Devyn

+1

Что может сделать stty (и termios), это изменить символ прерывания из control- C, чтобы контролировать-A. –

+0

Было бы полезно объяснить, что это делает, я могу сказать, но новичок может этого не сделать. Я верю, что человек, который знает 100%, но может общаться на 10%, не так полезен, как человек, который знает 50%, но может общаться на 90% .. –

0

Вот как установить CTRL-A в качестве прерывания для разрыва процесса. Также обратите внимание, что CTRL-C не прерывает его после tcsetattr.

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

int main(int argc, char* argv[]) { 
    struct termios termios; 

    if (tcgetattr(0, &termios) != -1) { 
     termios.c_cc[VINTR] = '\x01'; /* CTRL-A */ 
     if (tcsetattr(0, 0, &termios) != -1) { 
      printf("Ready. Press CTRL-A to break this program\n"); 
      while (1) { 
       printf("*\n"); 
       sleep(1); 
      } 
     } 
    } 
}