Intereting Posts
Это допустимый код C, но не действительный код на C ++? Скрытие паролей / ключей в скомпилированном приложении Несколько streamов и кеш процессора Объединение массива символов в C: динамическая обработка памяти наилучшая практика для предоставления C API-функций, скрывающих внутренние функции Поведение streamа мьютексов объединение упакованных данных с выравненным доступом к памяти проблемы с fread () всегда возвращаются 1 как отбрасывать из одного типа в другой в c Как программно вернуть максимум двух целых чисел без использования каких-либо операторов сравнения и без использования if, else и т. Д.? c openmp параллельно внутри параллельной области Чтение char с помощью char из входного файла в C? Разница в обработке kqueue от fifos между Mac OS и FreeBSD? Как читать ansible вход без блокировки в Windows Каков эффективный способ получить diff из двух массивов в C?

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

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

#include  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" с консоли, правильно?

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

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

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

Windows

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

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

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

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

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

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

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

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

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

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

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