20

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

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

#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') но во время тестирования программа не поймала меня на том, что я нажал клавишу ввода.'\n' кажется, соответствует мне, нажав клавишу ввода с консоли. Может кто-нибудь объяснить разницу? Также для проверки пишем какif... == "\n" будет означать символьную строку литерала? то есть пользователь буквально должен был бы войти"\n" с консоли, правильно?

  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceedednewline.

    от
  • (Надеюсь, вы не возражаете против изменений в названии, они сделаны для того, чтобы сделать его более доступным для поиска.)

    от user166390
  • Если ваш стандартный ввод открыт в текстовом режиме, то ваше приложение будетalways увидеть\n для новой строки, что угодно\n означает в вашем наборе символов выполнения, и тем не менее платформа сериализует переводы строки.

    от Kerrek SB
  • C применяет экранирование как к одинарным, так и к двойным кавычкам, поэтому & quot; \ n & quot; это строка длиной в два символа, во-первых, ASCII-код 10 (\ n сам по себе), а во-вторых - ASCII NUL (нулевой терминатор).

    от toriningen
  • И вы не можете проверить на равенство строк в C, используя ==, вы должны использоватьstrcmp или похожие.char *s1, *s2; if (s1 == s2) {...} просто проверим, еслиs1 а такжеs2 указывают на одну и ту же область памяти, независимо от фактического содержимого памяти.

    от toriningen
  • Связанные с:stackoverflow.com/questions/1355095/…

    от Mysticial
  • 13

    Различные операционные системы будут обрабатывать новые строки по-раз

    \ N ' является "перевод строки" и 'r'; это возврат каретки.ному, например,

    Windows

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

    Linux\Unix and Modern Mac OS

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

    Classic Mac OS

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

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

  • 3

    Также помните, что если вы введете 25 символов и Enter, первый

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

  • 35

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

    Error: User Rate Limit Exceeded\n потому что он используется всеми; а такжеif (x == '\n') это правильный способ проверить равенство символов.

  • 1

    Error: User Rate Limit Exceeded

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