Как работает функция getchar? - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Не совсем понимаю как работает функция getchar. Нашёл такое описание: Функция getchar за одно обращение к ней выдает в качестве результата один символ, поступивший с системного ввода. Возьмём к примеру такую программу, которая подсчитывает количество введённых символов:
#include <stdio.h>
main(){ double cnt = 0.0;
   while (getchar() != EOF) ++cnt;
   printf("%.0f\n", cnt );
}
Всё работает верно. Количество введённых символов выдает верно, то есть как надо, в условии считывается ОДИН символ, затем увеличивается счётчик. А теперь такая программа, которая должна печатать введённые нами символы:
#include <stdio.h>
main()
{
   char c;    
   while((c=getchar())!=EOF) putchar(c);
}
В таком случае программа печатает введённые нами символы только после нажатия Enter. То есть в условие считывается не ОДИН символ, а они считываются пока не нажат Enter. А если изменить код так:
#include <stdio.h>
main()
{
   char c;    
   while(c=getchar()!=EOF) putchar(c);
}
То вместо символов печатаются смайлики. Ничего не могу понять. Помогите разобраться. Правильно ли я понимаю, что getchar считывает ОДИН символ и переходит к следующей строке программы? Если да, то почему во втором случае он ждёт нажатие Enter?

Решение задачи: «Как работает функция getchar?»

textual
Листинг программы
#include<stdio.h>
main()
{
    int c;
    while((c=getchar())!=EOF)
    putchar(c);
}

Объяснение кода листинга программы

  1. Включаем файл для использования функций ввода-вывода.
  2. Определяем функцию main().
  3. Объявляем переменную типа int c для хранения значения, возвращаемого функцией getchar().
  4. Входим в цикл while, условием которого является неравенство c и EOF (конец файла).
  5. Внутри цикла вызываем функцию getchar() и присваиваем её результат переменной c.
  6. Вызываем функцию putchar() для вывода значения переменной c.
  7. Цикл продолжается до тех пор, пока не будет достигнуто условие окончания (EOF).
  8. Выход из функции main() происходит автоматически после достижения условия окончания цикла.

Оцени полезность:

13   голосов , оценка 3.769 из 5