#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
. В зависимости от компилятора он может автоматически инициализироваться значением . В противном случае вы столкнетесь с неопределенным поведением.