Как я могу отправить CR (т. е. ascii 13) в программу ac с клавиатуры (под управлением Linux)? ТАКЖЕ, почему мне нужно дважды отправлять EOF, чтобы завершить эту программу?

Я читал, что Ctrl-Jотправляет '\n', Ctrl-Mотправляет '\r' и Ctrl- Dотправляет EOF, но либо это неверно, либо я просто не понимаю, что происходит. Эта простая программа иллюстрирует:

      const size_t SIZE = 100;

int main()
{
    char str[SIZE];
    printf("Enter string: ");
    size_t len = 0;
    char ch;
    while ((ch = getchar()) != '\r' && ch != '\n' && ch != EOF && len < SIZE -1)
    {
        str[len++] = ch;
        printf("ch is %i\n",ch);
    }
    printf("ch is %i\n",ch);
    str[len] = '\0';
    printf("%s\n",str);
    
    return 0;
}

Когда я ввожу: hello(Ctrl-j), результат именно такой, как я ожидал:

      ch is 104
ch is 101
ch is 108
ch is 108
ch is 111
ch is 10
hello

но когда я ввожу: hello(Ctrl-m), результат точно такой же - т.е. последний ch по-прежнему равен 10, а не 13, как я ожидал.

И когда я ввожу: hello (Ctrl-d), вывод останавливается в начале строки, следующей за «ch is 111» («o»):

      ch is 101
ch is 108
ch is 108
ch is 111

и ждет, пока я не нажму Ctrl-d во второй раз, после чего это закончится:

      ch is -1
hello

или, если вместо секунды Ctrl- Dнажимаю Ctrl-Jили Enter. В этом случае оно заканчивается

      [blank line]
ch is 10
hello

потерять -1 и вместо этого напечатать 10 для '\n'.

Я пробовал это на настольном компьютере под управлением Arch Linux, а также на ноутбуке под управлением Ubuntu — в обоих случаях результаты одинаковые.

Итак, есть ли на самом деле способ отправить CR с клавиатуры под Linux и почему EOF нужно отправлять дважды?

0 ответов

Другие вопросы по тегам