Мой код чрезвычайно прост, но я считаю, что лучше всего понять, что происходит в моей программе. По какой-то причине я не могу заставить ungetc()
работать должным образом и не могу понять его предназначение. Обычно ungetc()
должен возвращать персонажа обратно в поток, или, по крайней мере, я так думаю. Например, если я наберу ABC, проведя три символа через getchar()
, я ожидаю, что ungetc()
вернет одну из возвращенных букв getchar()
. Если я позже позвоню putchar()
, я ожидаю, что B будет возвращен, поскольку C был брошен обратно в поток, но C был возвращен. Я пробовал как getchar()
, так и getc()
и столкнулся с одной и той же проблемой.
В сокращенной версии я ввел «ABC» в свою программу, ожидая, что ungetc()
заставит putc()
вернуть «B», но все, что я снова получаю, это C. Почему это происходит?
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
char c;
c=getchar();
c=getchar();
c=getchar();
ungetc(c, stdout);
putchar(c);
}
Спасибо за ответ, это было очень полезно. Я тестировал ungetchar(), используя его перед каждым c=getchar(), и, похоже, это работает. Если я не использую символ unget(), он циклически проходит через входной поток. Если я использую unget() char после каждого getchar(), он остается на A, что означает, что A (или первый символ) возвращается в буфер.
c
должен быть int
, а не char
, чтобы соответствовать используемым функциям. Бесполезно присваивать значения c
, если они не используются. Тем не менее, вы можете полностью исключить переменную (бесточечный стиль).c
на stdin
вместо stdout
.getchar()
после ungetc()
, чтобы продемонстрировать интересующее свойство, в противном случае вы просто распечатаете предыдущее прочитанное значение.#include <stdio.h>
int main(void) {
getchar();
getchar();
ungetc(getchar(), stdin);
putchar(getchar());
}
и пример запуска:
ABC
C
ungetc
— функция ВВОД. Используйтеungetc(c, stdin);
. Кстати, все, что делается, это помещаетсяc
обратно во входной буфер, так что следующийgetchar
получит это снова. Это не меняетсяc
.