我正在阅读kerninghan Ritchie Edition 2的书。它包含getch()
,ungetch()
,getop()
等的代码函数。我无法理解这些内容和我觉得它也有点不完整。因此,我在这里发布问题。
无法理解... getch(),ungetch()函数正在做什么。请举几个例子来说明这些功能。
最后。这些getch()和ungetch(0函数由getOp()使用。这个函数做了什么。只有例子可以做。没有代码解释reqd。我将尝试自我管理。如果我有一些示例。
请举几个例子让这段代码看起来更容易;如果程序中有任何更正,请告诉我。
由于
#include <stdio.h>
#include <ctype.h>
#define BUFSIZE 100
char buf[BUFSIZE]; /* buffer for ungetch */
int bufp = 0; /* next free position in buf */
int getch(void) /* get a (possibly pushed-back) character */
{
return (bufp > 0) ? buf[--bufp] : getchar();
}
void ungetch(int c) /* push character back on input */
{
if(bufp >= BUFSIZE)
printf(" ungetch too many characters\n");
else
buf[bufp++] = c;
}
/* getop: get next character or numeric operand */
int getop(char s[])
{
int i, c;
while ((s[0] = c = getch()) == ' ' || c == '\t');
s[1] = '\0';
if(!isdigit(c) && c != '.')
return c; /* not a number */
i=0;
if(isdigit(c)) /* collect integer part */
while(isdigit(s[++i] = c = getch()));
if(c == '.') /* collect fractional part */
while(isdigit(s[++i] = c = getch()));
s[i] = '\0';
if (c != EOF)
ungetch(c);
}
答案 0 :(得分:2)
你这里有一个错字:
while(isdigit([s++i] = c = getch()));
将其更改为:
while(isdigit(s[++i] = c = getch()));
答案 1 :(得分:1)
乍一看,我认为它也不完整,但后来我发现了以下关键线:
return (bufp > 0) ? buf[--bufp] : getchar();
关于你不知道的机会,a? b:c语法是三元语句,意思是“如果a为真,则执行b,否则执行c”。在这种情况下,如果bufp
,数组buf
中的字符数大于0,getch()
将递减bufp
并返回最后一个缓冲区中的字符(意味着缓冲区实际上充当堆栈,因为ungetch()
将字符添加到缓冲区的尾部而不是头部)。如果buf
中没有字符(即bufp
&lt; = 0),则函数调用getchar()
并返回从中获取的值。除此之外,我不知道你的混乱可能来自哪里,除非你的问题确实源于Paul R提到的那个错字,而且这句话之前的一切都毫无意义。
答案 2 :(得分:1)
getchar()从stdin中读取并删除。如果你没有保留它,你读到的内容就会丢失。 这是pop和push函数getch()和ungetch()com的用武之地。在getop中,你有一个小型解析器,其前瞻为1(提前一个字符)。
getop()