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().据我所知,这是它需要采取的步骤:
我想问一个更具体的问题,但我真的不知道这段代码是如何实现它的目标的,所以我的问题是:(a)目的和(b)这段代码的推理是什么?
提前致谢.
注意:对于任何K&R风扇,此代码可以在第79页找到(根据您的版本,我想)
(a)这段代码的目的是能够读取一个字符然后"取消读取"它,如果事实证明你不小心读了太多字符(最多100字符是"未读") .这在具有前瞻性的解析器中很有用.
(b)中getch读出buf,如果它有内容,以表示bufp>0.如果buf为空,则调用getchar.请注意,它buf用作堆栈:它从右到左读取它.
ungetchbuf在检查堆栈是否已满后,将字符推入堆栈.