Почему getchar() читает всю строку?

Образец программы выглядит следующим образом:

int main(void)
{
    char input;

    printf("\nEnter phone number: ");

    while ((input = getchar()) != '\n') {

        switch (toupper(input)) {
            case 'A': case 'B': case 'C':
                printf("2");
                break;
            case 'D': case 'E': case 'F':
                printf("3");
                break;
            case 'G': case 'H': case 'I':
                printf("4");
                break;
            case 'J': case 'K': case 'L':
                printf("5");
                break;
            case 'M': case 'N': case 'O':
                printf("6");
                break;
            case 'P': case 'R': case 'S':
                printf("7");
                break;
            case 'T': case 'U': case 'V':
                printf("8");
                break;
            case 'W': case 'X': case 'Y':
                printf("9");
                break;
            default:
                putchar(input);
        }
    }

    printf("\n\n");

    return 0;
}

Мой вопрос в том, как здесь работает поток? Я не могу понять путь, по которому пошла программа. Станет ли переменная char волшебным образом массивом? Как получается, что putchar() печатает всю строку вместо первого введенного символа? Как именно то, что должно получать и печатать один символ, считывает и печатает целую строку символов, изменяя их с помощью оператора switch? Проверяет ли он каждый введенный char? Но тогда как строка печатается как строка?

Редактировать: я провел некоторое исследование и прочитал о буфере клавиатуры, который, кажется, является причиной моего замешательства. Насколько мне известно, getchar() и putchar() получают и выводят один символ. Я знаю, что цикл постоянно запрашивает следующий «буферизованный» символ, когда возвращается getchar(), все еще немного сбит с толку тем, что я должен его получить, но что еще больше сбивает с толку, так это putchar(). В конце цикла, когда он прерывается и переходит к условию, печатает ли он этот один символ, затем продолжает и печатает другой один за другим при каждом выполнении цикла? Только останавливать цикл, в какой момент была прочитана новая строка? И если да, то на экране отображается только то, что было напечатано ранее? И тогда, если это так, то напечатанные символы будут печататься в строке рядом друг с другом при каждом выполнении, создавая иллюзию строки? Мне нужно подтверждение этого, а также, когда char выбрасывается и заменяется? После его печати? И в какой строке он получает next char в очереди буфера?


person Theory Of Infinity    schedule 24.04.2016    source источник
comment
Возможный дубликат теории, лежащей в основе функций getchar() и putchar()   -  person Ross Meikleham    schedule 25.04.2016
comment
Пройдитесь по коду с помощью отладчика, и вы увидите, что он получает ввод и печатает его посимвольно в цикле.   -  person Unimportant    schedule 25.04.2016
comment
Объясните, пожалуйста, в чем именно проблема. Кажется, вы запускаете программу и наблюдаете вывод, который отличается от ожидаемого. Поэтому, пожалуйста, покажите, чего вы ожидаете и что вы на самом деле получили.   -  person rpy    schedule 25.04.2016
comment
Я предлагаю вам найти хорошую книгу, чтобы учиться у   -  person Andreas DM    schedule 25.04.2016
comment
Подсказка: ваш внешний цикл while ((input = getchar()) != '\n') считывает каждый символ по одному, пока он не будет равен чему? '\n' (где это находится?)   -  person David C. Rankin    schedule 25.04.2016
comment
Я ожидаю, что будет напечатан один символ, а затем запрос на другой, или же напечатан только один символ; первый из того, сколько когда-либо было введено   -  person Theory Of Infinity    schedule 25.04.2016
comment
Подумайте над этим: почему вы видите что-то на своем экране, когда вводите текст в окно терминала? Почему вы можете вернуться назад, чтобы исправить ошибки при наборе текста, прежде чем нажать клавишу ввода, но не после? Командная строка предоставляется другой обычной программой — она имеет те же инструменты для работы, что и ваша программа.   -  person John Bollinger    schedule 25.04.2016