Клавиша DEL, дающая неверное значение ASCII

#c #ascii

Вопрос:

РЕДАКТИРОВАТЬ: Я использую Win10, ванильный CMD

Я проверил случайную таблицу ascii в Интернете, где было написано :

Значение dec ключа DEL: 127

, поэтому я написал программу, чтобы сделать именно это:

 #include <stdio.h>
#include <conio.h>
#include <math.h>

#define EXKEY 127  //Important
#define CONKEY 32  //Not important


#define LAMBDA 3.2
#define VAL 0.5

double eq1(double a);

int main(){
    char key;
    double x;

    printf("Press SPACE to get the next iteration (DEL to exit)nn");
    getch();
    for (x=VAL;;){
        printf("%lfn", eq1(x));
        x = eq1(x);

        //PROBLEM

        no: key = getch();
        if (key!= CONKEY){
            printf("%d, %cn",key, key);
            goto no;
        }
        if (key == EXKEY){
            break;
        }
    }
    return 0;
}

double eq1(double a){
    /*
        Not important 
    */
    return LAMBDA*a*(1-a);
}

 

Тем не менее, результат:

 Press SPACE to get the next iteration (DEL to exit)

0.800000 //Pressed random key
83, S //[83,-32], These two results come when I press DEL
-32, α
83, S
-32, α
83, S
-32, α
83, S
115, s //I pressed s here
115, s
83, S //I pressed Shift S here
83, S
83, S
83, S
83, S
 

Мне было бы лучше использовать TAB или BSpace, но мне любопытно:

  • Как появился -32?
  • Почему «С»?
  • Как получилось, что всего две ценности?
  • Как решить эту проблему, если я когда-нибудь снова столкнусь с этим, не обязательно на моей машине….

Комментарии:

1. Нужен тег ОС; это важно

2. 1. Почему вы используете goto 2. Подумайте, что находится во входном буфере (новые строки и т. Д.)

3. Нам также, вероятно, нужно знать, какой терминал вы используете. Короткий ответ заключается в том, что в этой таблице показаны значения символов BS (backspace) и DEL, а не ключей. Разные терминалы будут делать разные вещи, когда вы нажимаете эти клавиши. Если бы мы знали, какую систему вы используете, мы могли бы предоставить больше информации.

4. goto проклят. Держись от этого подальше. Вы можете пройти всю свою карьеру, не используя его. Существует чрезвычайно узкий набор обстоятельств, при которых это лучший выбор, но они настолько эзотеричны, что их трудно даже объяснить.

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