Подтвердить что ты не робот

Чтение\r (возврат каретки) vs\n (newline) с консоли с помощью getc?

Я пишу функцию, которая в основном ждет, когда пользователь ударит "enter", а затем что-то сделает. То, что я обнаружил, работает при тестировании ниже:

#include <stdio.h>

int main()
{
        int x = getc(stdin);
        if (x == '\n') {
                printf("carriage return");
                printf("\n");
        }
        else {
                printf("missed it");
                printf("\n");
        }
}

Вопрос, который у меня есть, и то, что я пробовал сначала, это сделать: if (x == '\r'), но при тестировании программа не поймала, как я попадаю в enter. Кажется, что '\n' соответствует тому, что я нажимаю кнопку ввода с консоли. Может кто-то объяснить разницу? Кроме того, чтобы проверить, что запись в качестве if... == "\n" будет означать буквенный символ символа? то есть пользователю буквально нужно будет ввести "\n" из консоли, исправить?

4b9b3361

Ответ 1

\n - символ новой строки, а \r - возврат каретки. Они отличаются тем, что их использует. Windows использует \r\n для обозначения нажатия клавиши ввода, в то время как Linux и Unix используют \n для обозначения нажатия клавиши ввода.

Таким образом, я всегда использовал \n, потому что он использовался всеми; и if (x == '\n') - это правильный способ проверки равенства символов.

Ответ 2

"\n" - это "Линейный канал", а "\ r" - возврат каретки. Различные операционные системы будут обрабатывать новые строки по-другому, например

Окно

Ожидает, что новая строка будет состоять из двух символов:\r\n.

Linux\Unix и современная Mac OS

Использует одиночную '\n' для новой строки.

Классическая Mac OS

Использует одну '\ r' для новой строки.

В принципе, я бы использовал if (x == '\n'), поскольку в настоящее время он используется всеми современными операционными системами.

Ответ 3

Также помните, что если вы введете 25 символов и Enter, первый getc не вернется, пока все 25 символов не будут введены, и вы нажмете Enter. Чтение персонажа в момент его ввода требует кода, специфичного для платформы. Следовательно, вам может быть лучше просто прочитать всю строку, выполнив fgets в строку, обрезая новую строку и обработав входную строку в целом.

Ответ 4

Использование gets() открывает вам эксплойты переполнения буфера и, следовательно, возможно, атаки кода оболочки. Вы должны использовать fgets() и передать размер буфера.

Ответ 5

Существует несколько уровней абстракций, представляющих новую строку - среду выполнения языка программирования, текстовый редактор и ОС. CR (возврат каретки) и LF (подача линии) являются двумя управляющими характеристиками, которые определены в ASCII. Некоторая другая кодировка charator также может определять символ "новая строка". Клавиша Enter на любой клавиатуре передает значение "в начало следующей строки". Клавиатура решает, как сопоставить клавишу Enter с соответствующим контрольным характором или характеристиками. Некоторая клавиатура также дифференцирует клавишу "Enter" и "Enter" - введите Enter в новую строку, а Return key - возврат каретки. В стандартной клавиатуре ANSI имеется только клавиша Enter, которая отображается в кадре-возврате (13) в ASCII. Таким образом, это фактическое содержимое, которое отправляется ОС операционной системой. Однако другая ОС решает интерпретировать клавишу Enter по-разному. Таким образом, в Unix-подобной системе любой возврат каретки преобразуется в генератор строки строки (10 в ASCII) перед передачей программе, которая получает вход. И в Windows CR преобразуется в два символа - CR, за которым следует LF. Тем не менее, вы можете установить входной поток в сырой режим, и в этом случае программа получает то, что фактически посылает клавиатура. Теперь редактор вступает в игру. Когда редактор получает CR из stdin в сыром режиме, он знает, что CR соответствует клавише Enter на клавиатуре (предположение о клавиатуре), и он должен отображать новую строку на экране. В необработанном режиме он должен вызывать системный вызов записи для вывода CR + LF. Если выходной поток не находится в сыром режиме, текстовый редактор должен выводить последовательность, специфичную для ОС, такую ​​как LF на linux.

Наконец, языковая среда исполнения также может интерпретировать новую строку по-своему. Например, в стандарте C сказано, что при записи файла в текстовом режиме '\n' прозрачно переводится в собственную последовательность строк новой строки, используемую системой, которая может быть длиннее одного символа. При чтении в текстовом режиме собственная последовательность строк новой строки переводится на "\n" . В двоичном режиме перевод не выполняется, и внутреннее представление, созданное '\n', выводится напрямую. Обратите внимание, что '\n' и '\ r' являются языковыми характеристиками, которые представляют LF и CR соответственно, которые популярны на языках C-типа. Но не каждый язык должен использовать это обозначение.

Для вас второй вопрос: "\n" - это "\n" , за которым следует терминатор "\ 0". Невозможно ввести "\ 0" с консоли.