Функции putchar и getchar

#c #getchar #putchar

#c #getchar #putchar

Вопрос:

Кто-нибудь может помочь мне разобраться, как работают эти функции.
Есть два фрагмента кода — с циклом while и без него.

 #include <stdio.h>
int main(void) 
{
char z;
z = getchar();
putchar (z);
}
 

Вторая

 #include <stdio.h>
int main(void)
{
char z;
while (z != '.')
{
z = getchar();
putchar(z);
}
}
 

Проблема в том, что первая работает правильно, в то время как вторая возвращает все полученные символы (например, если ввод был 2222, функция возвращает 2222). Почему он не вернул 2?

Комментарии:

1. Где . точка в заявленном вами вводе, которая завершила цикл? Пожалуйста, будьте точны. Почему первый пример был «правильным» при вводе 2222 ?

2. Ваша программа имеет неопределенное поведение при сравнении неинициализированной z переменной с '.' . Он также имеет UB, когда входные данные не содержат символа точки. Также неясно, почему вы ожидаете, что он будет печатать (не «return», return — это термин со своим отдельным значением) только один 2 символ.

3. Внутри вашего цикла while каждая нажатая вами клавиша добавляет символ в буфер клавиатуры. Затем, когда вы нажимаете Enter, getchar() считывает первый символ в буфере, который также удаляет его из буфера. Каждый последующий вызов getchar() считывает и удаляет следующий символ и так далее. Поэтому вторая версия выводит 2222. Ваше условие выхода — если, если getchar() встретит «.» он больше не будет продолжать чтение из буфера.

Ответ №1:

Две версии отличаются.

В первой версии вы читаете сингл char и записываете его.

Во втором вы продолжаете читать char и записывать его, пока char не наступит точка. Обратите внимание, что точка будет считываться и записываться. Игнорируется только следующий проход. Однако есть одно предостережение. Вы не инициализировали z . В зависимости от компилятора он может автоматически инициализироваться значением . В противном случае вы столкнетесь с неопределенным поведением.