2013-12-02 2 views
0

Я разрабатываю программу, которая использует 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); 
+1

'szString = '\ 0';' должен дать вам предупреждение от целочисленного указателя и 'malloc' на следующей строке делает его избыточным ... – Kninnug

ответ

1

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

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; 
} 

Если на окнах вы можете использовать Геч вместо указанной выше function.Ignore вход, если read character is 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; 
+0

не проверено на windows..i не имеет окон система. – rjv

1

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

Первоначальный ответ: Почему бы просто не использовать getch() вместо этого и распечатать и обработать символ - если это не backspace!

+0

Поскольку getche() печатает то, что вы вводите в режиме реального времени. Я не хочу использовать другую функцию. – user2729661

+0

@ user2729661 Просто напечатайте символ внутри цикла. Эффект тот же. –

+0

@GuilhermeBernal, извините, но для этого упражнения допускается только getche(), поэтому я спрашиваю, можно ли с ним обращаться с ним. – user2729661

0

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

+0

Абсолютно корректно, но при нажатии BackSpace с помощью getche() он действительно не удаляет последний символ. – user2729661

0

да, просто убедитесь, что пользователь нажимает забой или нет, если забой обнаружен, то просто игнорируйте не увеличивают значение индексируются переменной и использовать продолжить или поместить свой код внутри, если еще блок и просто пропустить часть забоя

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