Этот код исходит от K&R. Я читал ее несколько раз, но она все еще ускользает от моего понимания.
#define BUFSIZE 100
char buf[BUFSIZE];
int bufp = 0;
int getch(void)
{
return(bufp>0)?buf[--bufp]:getchar();
}
int ungetch(int c)
{
if(bufp>=BUFSIZE)
printf("too many characters");
else buf[bufp++]=c;
}
Цель этих двух функций, как говорит K&R, состоит в том, чтобы предотвратить чтение программой слишком большого количества входных данных. то есть без этого кода функция не сможет определить, что она прочитала достаточно данных, не прочитав сначала слишком много. Но я не понимаю, как это работает.
Например, рассмотрим getch(). Насколько я вижу, это шаги, которые он предпринимает:
- проверьте, больше ли bufp 0.
- если да, то верните символьное значение buf[--bufp].
- иначе вернуть getchar().
Я хотел бы задать более конкретный вопрос, но я буквально не знаю, как этот код достигает того, для чего он предназначен, поэтому мой вопрос: какова (а) цель и (б) аргументация этого кода?
Заранее спасибо.
ПРИМЕЧАНИЕ. Для всех поклонников K&R этот код можно найти на странице 79 (полагаю, в зависимости от вашего издания)
ungetch
, вероятно, должен включатьbufp
, а неprintf
в своем состоянии. Я думаю, это опечатка. - person Basile Starynkevitch   schedule 14.12.2011bufp>=BUFSIZE
- person kol   schedule 14.12.2011bufp > BUFSIZE
, но это выглядит как ошибка. - person Fred Larson   schedule 14.12.2011