getchar() не работает должным образом?

Итак, я получаю странные результаты, используя getchar в Visual Studio 2012 Ultimate. Это самый простой пример, который я мог придумать, чтобы показать, что это не ошибка кода, а что-то еще в действии.

#include <cstdio>

int main(int argc, char* argv[]) {
    char c = getchar();
    putchar(c);
    return 0;
}

Однако результат (визуально) немного похож на «cin» в библиотеке iostream. getchar возвращает один символ, как и должен (первый), но когда я нажимаю клавиши, он отображает символы на экране и не возвращается, пока я не нажму Enter. Я немного поискал и не могу найти других случаев, когда это происходит, есть ли у кого-нибудь подсказки относительно того, что здесь происходит?


person Samo FiveOTwo    schedule 25.04.2013    source источник


Ответы (2)


Стандартный ввод обычно буферизуется строкой. Это означает, что система будет считывать и сохранять символы по мере их ввода в буфер ввода до тех пор, пока вы не введете полную строку текста. Функция getchar() считывает символы из этого входного буфера.

Для большинства целей имеет смысл читать ввод целиком по строке за раз, а затем обрабатывать строку после ее прочтения.

Есть способы получить немедленный ввод по одному символу за раз, но они специфичны для системы (и немного уродливы). Это обсуждается в вопросе 19.1 часто задаваемых вопросов о comp.lang.c.

person Keith Thompson    schedule 25.04.2013
comment
Это довольно хорошо отвечает на него. Спасибо. - person Samo FiveOTwo; 25.04.2013

Ввод буферизуется строкой, поэтому getchar будет принимать символ только после того, как будет введена хотя бы строка ввода. Если вы не закончите строку, а вместо этого закроете ввод ^D в Linux, я думаю, ^Z в Windows, то вы увидите, что он также напечатает первый символ.

person Bryan Olivier    schedule 25.04.2013