Чтение\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"
из консоли, исправить?
Ответы
Ответ 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" с консоли.