Запретить пользователю нажимать клавишу Backspace

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

Проблема в том, что я хотел бы запретить пользователю нажимать Backspace для исправления ввода. Можно ли каким-то образом заблокировать клавишу Blackspace в C при использовании getche()?

Моя последняя программа будет иметь два входа: один без Backspace (вы не можете вернуться), а другой с Backspace. (вы можете исправить ввод и затем нажать Enter).

char *szString;
char *tmp;
int i = 0;
char c;

szString = '\0';
szString = malloc(1);

printf("Enter a string: ");

while ((c = getche()) != '\r')
{
    if(c = 0x08) // BackSpace
    {
        //
    }
    szString[i] = c;
    i++;
    tmp = realloc(szString, i+1);
    szString = tmp;
}

szString[i] = '\0';

printf("\nYou typed: %s", szString);

person user2729661    schedule 02.12.2013    source источник
comment
szString = '\0'; должен выдать предупреждение о переходе от целого числа к указателю &, а malloc в следующей строке делает его избыточным ...   -  person Kninnug    schedule 02.12.2013


Ответы (4)


Ниже приведена грубая реализация функции, которая возвращает -1, если backspace, иначе сам символ

char read_all_except_backspace()
{
    char ch;
    system("stty raw");
    ch = getchar();
    system("stty cooked");
    if(ch == 127)
        //value of backspace in my unix implementation is 127,i doubt it :-/
        return -1;
   else
      return ch;
}   

Если в Windows вы можете использовать getch вместо вышеуказанной функции. Игнорируйте ввод, если прочитанный символ - это backspace. Вы можете найти значение backspace, распечатав его как целое число.

Вышесказанное может быть достигнуто в системе Windows чем-то вроде этого.

char ch=0,str[100];
int i=0;
while(ch!=10)//enter pressed
{
    ch = getch();
    if(ch == 127)
        continue;
    str[i++]=ch;
}
str[i-1]=0;
person rjv    schedule 02.12.2013

Новый ответ: ОК, тогда я бы обновил код, чтобы напечатать последний символ строки (снова), чтобы переместить курсор в позицию до возврата (и перепрыгнуть через остальную часть кода).

Исходный ответ: почему бы просто не использовать вместо этого getch(), а также распечатать и обработать символ - если только это не обратный пробел!

person Andrew Rump    schedule 02.12.2013
comment
Потому что getche () печатает то, что вы вводите, в режиме реального времени. Я не хочу использовать другую функцию. - person user2729661; 02.12.2013
comment
@ user2729661 Просто напечатайте символ внутри вашего цикла. Эффект такой же. - person Guilherme Bernal; 02.12.2013
comment
@GuilhermeBernal, извините, но для этого упражнения разрешен только getche (), поэтому я спрашиваю, можно ли с его помощью обработать backspace. - person user2729661; 02.12.2013

Функция getche () автоматически отображает прочитанный символ на экране. Если вы хотите, чтобы backspace «не удалял» уже введенные символы, вам придется повторно повторить эхо (перепечатать) последний символ, введенный перед backspace, чтобы он «выглядел так, как будто» клавиша Backspace не была зарегистрирована.

person Joy Rê    schedule 02.12.2013
comment
Абсолютно правильно, но при нажатии BackSpace с помощью getche () последний символ не удаляется. - person user2729661; 02.12.2013

да, просто проверьте, нажимает ли пользователь backspace или нет, если обнаружено backspace, просто игнорируйте, не увеличивайте значение переменной с индексом и используйте continue или поместите свой код внутри блока if else и просто пропустите часть backspace

person asifaftab87    schedule 02.12.2013