帮助理解K& R练习

时间:2010-06-18 13:42:31

标签: c

我正在阅读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);

}

3 个答案:

答案 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()

  • 跳过空白和标签
  • 如果c没有数字且没有点,则返回此字符
  • 读取数字和点数以及更多数字
  • 如果读取的字符不是数字,则将其推回并保留功能