как проверить символ возврата в C

Я хотел бы знать, как проверить, вводит ли пользователь символ "backspace".

Я использую getch() function i.e. "key = getch()" в своей программе на C, и я хотел бы проверить, когда нажата клавиша Backspace. линия:

 if(key = '\b') { ....

не работает.


person joel    schedule 06.12.2010    source источник
comment
Вы пробовали смотреть на функцию «клавиатура»?   -  person Oscar Mederos    schedule 06.12.2010
comment
@Эндрю Уайт: Беллу \a.   -  person ephemient    schedule 06.12.2010
comment
а также вам нужны два знака равенства == вместо = для сравнения   -  person Afriza N. Arief    schedule 06.12.2010
comment
@ephemient Я исправлен, спасибо, что прояснили это.   -  person Andrew White    schedule 06.12.2010


Ответы (5)


Проблема с чтением Backspace состоит в том, что большинство терминалов "приготовлены" в том, что такие клавиши, как backspace, обрабатываются драйвером терминала. Однако функция curses getch() может читать backspace, так как она не привязана к терминалу.

Редактировать

Я только что заметил, что ваш код использует getch() для ввода. Я запустил небольшую тестовую программу, и getch() возвращает 127, когда вы нажимаете клавишу Backspace. Поэтому попробуйте:

if (key == 127 || key == 8) { ... /* Checks for both Delete or Backspace */

Также обратите внимание, что в примере кода используется оператор присваивания = вместо оператора равенства ==.

person SiegeX    schedule 06.12.2010
comment
Как ни странно, фактический код ASCII для возврата - 8 (\b, ^H); 127 (^?) удалить. Отправляет ли клавиша с надписью Backspace (или удалить) на вашей клавиатуре 8 или 127, зависит от настроек вашего терминального приложения. Возможно, вы захотите проверить оба. - person David Gelhar; 06.12.2010
comment
@SiegeX Спасибо за ваш ответ. Это было очень полезно. Кроме того, я исправляюсь с использованием оператора присваивания, а не оператора равенства. Ваше здоровье. - person joel; 06.12.2010
comment
Как заставить затененное поле представлять ключ с помощью Markdown? - person Karl Knechtel; 06.12.2010
comment
@SiegeX Оказывается, в моем терминальном приложении код ASCII для возврата равен 8, а не 127, как заметил г-н Гелхар. - person joel; 06.12.2010
comment
@Karl Knechtel ‹kbd›Ключевой текст‹/kbd› - person SiegeX; 06.12.2010
comment
@David Gelhar обновлен, чтобы отразить ваш комментарий. Спасибо за этот совет. - person SiegeX; 06.12.2010

Может помочь тип потока ввода-вывода. Стандартный поток ввода — это своего рода поток с буферизацией строки, который не очищается до тех пор, пока вы не напишете в него символ '\n'. Полный буферизованный поток никогда не очищается до тех пор, пока буфер не будет заполнен. Если вы напишете backspace в потоке full buff, может быть захвачена '\b'.

Ссылка на программу преимущества среды Unix.

person user531771    schedule 06.12.2010

Вы не сказали, из какой библиотеки берется функция getch() (она не является частью стандарта C), но если это библиотека из ncurses, вы можете сравнить значение key с KEY_BACKSPACE.

person Adrian Lopez    schedule 07.09.2016

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

#include <stdio.h>      /* printf   */
#include <ctype.h>      /* isalpha isdigit isspace etc      */

#define FALSE 0
#define TRUE  1

/* function declarations */
int char_type(char);

main()
{
 char ch;

 ch = 127;
 char_type(ch);

 ch = '\b';
 char_type(ch);

 return 0;
}

int char_type(char ch)
{
 if ( iscntrl(ch) != FALSE)
   printf("%c is a control character\n", ch); 
}

Это полная программа, но она проверяет только управляющие символы. Вы можете использовать его принципы, на ваш выбор. Просто тоже учится!

См.: http://www.tutorialspoint.com/c_standard_library/ctype_h.htm или поиск функции для заголовочного файла ctype.h стандартной библиотеки C.

Хорошо, что вы получаете информацию. Спасибо всем за информацию. Я просто искал код возврата и нашел этот вопрос.

Кстати, попробуйте «\ 0» перед любым символом. Не уверен, что это делает, но он останавливает весь код после него. Это похоже на return 0; линия?

person Douglas G. Allen    schedule 27.05.2015

Я считаю, что системный драйвер ввода буферизован. Так что это невозможно в стандартном C.

person Madhur Ahuja    schedule 06.12.2010
comment
Это не системный драйвер ввода; это другая программа, которая форматирует входные данные для вашей программы. - person Karl Knechtel; 06.12.2010