Как я могу отправить 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 нужно отправлять дважды?