Почему getchar() читает '\n' после оператора printf?


Я предлагаю пользователю ввести длину массива, инициализирую массив char[] этим вводом, а затем предлагаю пользователю ввести сообщение для ввода в массив char[].

Я читаю первый символ сообщения пользователя с getchar().

Однако getchar() считывает escape-последовательность новой строки '\n' до того, как читает любой пользовательский ввод. Кажется, он получает '\n' из предыдущего оператора printf, который предлагает пользователю...


Вот соответствующий код:

#include <stdio.h>

int main(void) {

    int len = 0,
        originalLen = 0;

    printf("\n\nWhat is the length of the array? ");
    scanf("%d", &originalLen);
    char str[originalLen]; // intitializing the array

    printf("Enter a message to enter into the array: ");
    char target = getchar();
    str[len] = target;

    // why is getchar() reading '\n'?
    if (target == '\n') {
        printf("\n...what happened?\n");
    }
    return 0;
} // end of main



person Ian Campbell    schedule 08.02.2013    source источник


Ответы (3)


Когда вы вводите число и нажимаете клавишу ENTER, число и символ помещаются в буфер ввода, а именно:

  • Введенный номер и
  • Символ новой строки (\n).

Число потребляется scanf, но новая строка остается во входном буфере, который считывается getchar().

Вам нужно использовать \n перед вызовом getchar(), используя:

scanf("%d ", &originalLen);
         ^^^

Это говорит scanf прочитать число и дополнительный символ, который является \n.

person Alok Save    schedule 08.02.2013
comment
Ах, спасибо @Alok, это имеет смысл - нажатие клавиши ENTER добавляет символ '\n'. Является ли scanf осужденным по этой причине? - person Ian Campbell; 08.02.2013
comment
@IanCampbell: Да, за это и многое другое. например: безопасность типов, проверка ввода и т. д. . Его следует избегать при чтении символов и строк, но его можно использовать для простых числовых вводов. - person Alok Save; 08.02.2013
comment
Спасибо, @Alok, интересно... так какая лучшая альтернатива scanf для символов и строк? - person Ian Campbell; 08.02.2013
comment
@IanCampbell: fgets всегда! - person Alok Save; 08.02.2013

Это потому, что предыдущий scanf не читает новую строку после числа.

Это можно решить двумя способами:

  1. Используйте, например. getchar прочитать
  2. Добавьте пробел после формата scanf (например, scanf("%d ", ...))
person Some programmer dude    schedule 08.02.2013
comment
Спасибо @Joachim, похоже, вам нужно использовать дополнительный пробел для scanf ... есть ли лучшая альтернатива или это профессионально принято? - person Ian Campbell; 08.02.2013
comment
@IanCampbell Я бы не назвал это взломом, он просто говорит scanf читать (и отбрасывать) пробелы. Что касается профессионально принятого, я сам много использовал его и видел во многих других кодах, так что это не редкость. - person Some programmer dude; 08.02.2013

Вы можете использовать getchar в цикле, чтобы очистить стандартный ввод перед чтением следующего символа.

while((target = getchar()) != '\n' && target != EOF)
person Simon Broadhead    schedule 08.02.2013