Функция getchar () считывает символ с клавиатуры (т. е. stdin
)
В условии внутри заданного цикла while
getchar()
вызывается перед каждой итерацией, и полученное значение присваивается целому числу c
.
Теперь необходимо понимать, что в C стандартный ввод (stdin
) - это как файл. т.е. ввод буферизуется. Ввод будет оставаться в буфере до тех пор, пока он не будет фактически использован. stdin
на самом деле является стандартным потоком ввода.
getchar()
возвращает следующее доступное значение во входном буфере.
Программа по сути отображает все, что было прочитано с клавиатуры; включая пробелы, такие как \n
(новая строка), пробел и т. д.
т.е. ввод - это ввод, который пользователь предоставляет с помощью клавиатуры (stdin
обычно означает клавиатуру). А на выходе получается то, что мы предоставляем на входе.
Предоставляемый нами ввод читается посимвольно и обрабатывается как символы, даже если мы даем их как числа.
getchar()
вернет EOF
, только если будет достигнут конец файла. «Файл», который нас интересует, - это сам stdin
(стандартный ввод).
Представьте, что существует файл, в котором сохраняется ввод, который мы вводим с клавиатуры. Это stdin
. Этот «файл» похож на бесконечный файл. Так что нет EOF
.
Если мы предоставим больше входных данных, чем то, что getchar()
может обрабатывать за один раз (перед тем, как передать их в качестве входных данных нажатием клавиши ввода), дополнительные значения все равно будут сохраняться во входном буфере без использования. getchar()
прочитает первый символ из ввода, сохранит его в c and print
cwith
putchar (c) `.
Во время следующей итерации цикла while
дополнительные символы, указанные во время предыдущей итерации, которые все еще находятся в stdin
, берутся во время while ((c = getchar()) != EOF)
с частью c=getchar()
. Теперь тот же процесс повторяется до тех пор, пока во входном буфере ничего не останется.
Это выглядит так, как будто putchar()
возвращает строку вместо одного символа за раз, если более одного символа задано в качестве входных данных во время итерации.
Например: если вход был
abcdefghijkl
выход был бы таким же
abcdefghijkl
Если вам не нужно такое поведение, вы можете добавить fflush ( stdin); сразу после putchar(c);
. Это приведет к тому, что цикл будет печатать только первый символ во входных данных, предоставленных во время каждой итерации.
Например: если введено
adgbad
будет напечатано только a
.
Ввод отправляется на stdin
только после того, как вы нажмете клавишу ввода.
putchar () является противоположностью getchar()
. Он записывает вывод в стандартный поток вывода (stdout
, обычно монитор).
EOF
не является символом в файле. Это то, что функция возвращает в виде кода ошибки.
Однако вы, вероятно, не сможете нормально выйти из цикла give while
. Буфер ввода будет очищен (для отображения на выходе), как только что-то поступит в него с клавиатуры, и stdin
не выдаст EOF
.
Для выхода из цикла вручную EOF
можно отправить с клавиатуры, нажав ctrl + D в Linux и
ctrl + Z в Windows
eg:
while ((c = getchar()) != EOF)
{
putchar(c);
fflush(stdin);
}
printf("\nGot past!");
Если вы нажмете комбинацию клавиш, чтобы дать EOF
, перед выходом из программы отобразится сообщение Got past!
.
Если stdin
не уже пуст, вам придется дважды нажать эту комбинацию клавиш. Один раз очистить этот буфер, а затем смоделировать EOF
.
РЕДАКТИРОВАТЬ: дополнительная пара круглых скобок вокруг c = getchar()
в while ((c = getchar()) != EOF)
предназначена для того, чтобы значение, возвращаемое getchar()
, было сначала присвоено c
перед тем, как это значение сравнивается с EOF
.
Если бы этой дополнительной круглой скобки не было, выражение фактически было бы while (c = (getchar() != EOF) )
, что означало бы, что c
могло иметь одно из двух значений: 1
(истина) или 0
(ложь), что явно не то, что предназначено.
person
J...S
schedule
08.08.2017