У меня есть два вопроса, связанных с getchar() и putchar()

#include<stdio.h>

main()
{
char c;
c=getchar();
putchar(c);

c=getchar();
putchar(c);

c=getchar(); 
putchar(c);

c=getchar();
putchar(c);

c=getchar();
putchar(c);

}

Мой первый вопрос заключается в том, что всякий раз, когда мы используем getchar(), он создает буфер где-то в памяти, и когда мы нажимаем ввод, getchar() начинает считывать содержимое из буфера и getchar () читать только один символ за раз. Итак, в этой вышеприведенной программе, когда будет выполняться 1-й getchar(), он создает буфер в памяти, и содержимое всей строки будет храниться в буфере, предположим, я пишу "vik", когда нажимаю Enter getchar() начинает чтение содержимого из буфера, затем 'v' присваивается переменной c, а затем только 'v' сбрасывается из буфера, потому что getchar() считывает только один символ за раз. Затем в следующем операторе putchar(c) выводит на экран 'v'. Итак, теперь «ik» остается в буфере, когда выполняется 2-й оператор getchar(), он не будет снова запрашивать у пользователя запись чего-либо, потому что до тех пор, пока буфер не будет полностью очищен, он не будет снова запрашивать у пользователя написать что-то, а не прочитать его содержимое из буфера. поэтому здесь «ik» остается в масле, поэтому во 2-м операторе getchar() считывается «i» из буфера, а затем снова «i» сбрасывается из буфера и putchar(c) печатает «i». Теперь 'k' остается в буфере, когда 3-й getchar() выполняет его, читает 'k' из буфера и присваивает значение c, а затем 'k' также сбрасывает из буфера. Теперь в этот момент буфер полностью сбрасывается, в буфере нет содержимого, когда 4-й getchar() выполнит свой запрос к пользователю что-то написать, потому что в буфере нет содержимого, поэтому давайте предположим, что я пишу «как» и нажимаю ввод. Теперь мой главный вопрос заключается в том, что когда я задаю два содержимого "as", и остаются два getchar() и putchar(c) для выполнения, так почему только "a" будет напечатано на экране, а не "s" также ?

И мой второй вопрос заключается в том, что если мы говорим, что когда мы используем getchar(), он создает буфер в памяти, поэтому, если мы используем fflush(stdin), он должен сбрасывать буфер. Итак, в соответствии с этим в приведенной выше программе, когда я пишу fflush(stdin) после 1-го putchar(c) вместо очистки буфера, он выполняется и выводит тот же вывод, что и вышеприведенная программа, почему?


person Vikas Verma    schedule 19.10.2013    source источник
comment
fflush(stdin) — это неопределенное поведение.   -  person Crowman    schedule 19.10.2013
comment
Вы должны добавить полные знаки препинания! (кричит   -  person acgtyrant    schedule 28.12.2013


Ответы (2)


.Теперь в этот момент буфер полностью очищен, в буфере нет содержимого, когда 4-й getchar() выполнит свой запрос к пользователю что-то написать, потому что в буфере нет содержимого, поэтому давайте предположим, что я пишу «как» и нажимаю ввод . Теперь мой главный вопрос заключается в том, что когда я даю два содержимого «как», и остается выполнить два getchar () и putchar (c), так почему только «a» будет напечатано на экране, а не «s»?

Нет. В буфере есть \n. И именно поэтому вы получаете только a при вводе as.

И мой второй вопрос заключается в том, что если мы говорим, что когда мы используем getchar(), он создает буфер в памяти, поэтому, если мы используем fflush(stdin), он должен очистить буфер. Итак, в соответствии с этим в приведенной выше программе, когда я пишу fflush (stdin) после 1-го putchar (c) вместо очистки буфера, он выполняется и печатает тот же вывод, что и указанная выше программа, почему?

fflush(stdin) вызовет неопределенное поведение (по стандарту ANSI C). Вы получите что угодно. Вам не повезло, что он печатает тот же результат.

person haccks    schedule 19.10.2013
comment
Не обязательно MS-DOS, Linux также поддерживает его: linux.die.net/man/3/ смывать - person Yu Hao; 19.10.2013
comment
Часть Описание: Для входных потоков fflush() отбрасывает любые буферизованные данные, которые были получены из базового файла, но не были использованы приложением. - person Yu Hao; 19.10.2013
comment
@ЮХао; Интересно! Никогда этого не знал. - person haccks; 19.10.2013

  1. Потому что новая строка после vik все еще находится в буфере. Итак, четвертый getchar() будет обрабатывать новую строку.

  2. fflush(stdin) не является стандартным C, поэтому поведение undefined, но некоторые компиляторы поддерживают его как расширение.

Обратите внимание, что вы должны объявить int c, иначе вы не сможете правильно обрабатывать EOF. И вы также должны проверить наличие EOF. Прототип getchar():

int getchar(void);
person Yu Hao    schedule 19.10.2013