请解释此示例C代码

5 c buffer kernighan-and-ritchie getchar

此代码来自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;
}
Run Code Online (Sandbox Code Playgroud)

K&R说,这两个功能的目的是防止程序读取太多输入.即没有这个代码,一个函数可能无法确定它已经读取了足够的数据而没有先阅读太多.但我不明白它是如何工作的.

例如,考虑getch().据我所知,这是它需要采取的步骤:

  1. 检查bufp是否大于0.
  2. 如果是,则返回buf [ - bufp]的char值.
  3. else返回getchar().

我想问一个更具体的问题,但我真的不知道这段代码是如何实现它的目标的,所以我的问题是:(a)目的和(b)这段代码的推理是什么?

提前致谢.

注意:对于任何K&R风扇,此代码可以在第79页找到(根据您的版本,我想)

Fre*_*Foo 9

(a)这段代码的目的是能够读取一个字符然后"取消读取"它,如果事实证明你不小心读了太多字符(最多100字符是"未读") .这在具有前瞻性的解析器中很有用.

(b)中getch读出buf,如果它有内容,以表示bufp>0.如果buf为空,则调用getchar.请注意,它buf用作堆栈:它从右到左读取它.

ungetchbuf在检查堆栈是否已满后,将字符推入堆栈.