0

无法弄清楚函数是如何被调用的。

Input 1 2 3 + + [Enter] //注意输入之间有空格

输出 6 //这是正确的

1 -> 当程序编译时,while 语句调用函数 getop(s)。

2 -> 在 getop() 函数中,它将调用 getch() 函数,该函数又调用 getchar() 所以在这一步它将读取 1 作为输入并返回它。

3 - >现在它检查c是否为数字,这是真的,所以它会再次调用读取空间的getch(),返回它的值,现在它检查它是否是数字,它被评估为假,然后它移动到下一个声明。

4 -> 最后 ungetch() 将被执行,将 1 保存在其缓冲区中

在这一步,我无法弄清楚输入是如何被读取的,以及 getch 和 ungetch 的用途是什么

#define MAXOP 100
#define NUMBER '0'

int getop(char[]);
void push(double);
double pop(void);

 main()
 {
      int type;
      double op2;
      char s[MAXOP];
      while((type=getop(s))
      {
          switch(type)
          {
            //Here all operation are performed as push pop addition etc.
            //This part of code is simple
          }
      }

push 和 pop 函数的定义很简单所以我就不写了

#include<ctype.h>
int getch(void);
void ungetch(int);

int getop(char s[]) {
     int i,c;
     while((s[0]=c=getch())==' '||c=='\t');
     s[1]='\0';
     if(!isdigit(c)&&c!='.')
          return c;
     i=0;
     if(isdigit(c))
         while(isdigit(s[++i]=c=getch()));
     if(c=='.')
         while(isdigit(s[++i]=c=getch()));

     s[i]='\0';
     if(c!=EOF)
         ungetch(c);
     return NUMBER;
}

#define BUFSIZE 100

char buf[BUFSIZE];
int bufp=0;

int getch(void) {
    return (bufp>0)?buf[--bufp]:getchar();
}

void ungetch(int c) {
    if(bufp>=BUFSIZE)
        printf("ungetch:too many character\n");
    else
        buf[bufp++]=c;
}
4

1 回答 1

4

4 -> 最后 ungetch() 将被执行,将 1 保存在其缓冲区中

不,对ungetchpass的调用c,此时包含一个空格,' '。所以getop返回NUMBER, sis "1",未处理的输入" "buf( 或者更确切地说buf = { ' ', ... }, bufp = 1) 和"2 3 + +\n"in stdin


ungetch将字符添加到buf. 如果不为空,则getch删除并返回字符;buf如果buf为空,则直接从stdin(via getchar) 读取。

这两个函数的目的是为了能够“未读”字符,即能够决定读完一个字符后你实际上还不想处理它,所以你把它放回去(下次返回你读输入)。这使您可以在输入中“窥视”。

例如,在读取输入时,"42+..."您首先需要提取数字42。为此,您首先阅读字符'4'。但是你不能停在那里,因为在第一个数字之后,后面可能会有更多的数字。所以你读下一个字符 ,'2'这很好,因为它也是一个数字。但随后你点击+,它不是数字,也不是数字的一部分。所以此时你停止处理输入,因为你知道完整的数字是42,但你需要一些关于+你刚刚读到的东西。您需要保留它,以便下一个输入操作可以返回它(否则我们只会默默地删除它,这会让用户感到非常困惑)。所以你打电话ungetch('+')继续处理42,知道下一个getch()会捡起+你刚放回去的。


我无法告诉您实际计算是如何完成的,因为您没有向我们展示该代码,但根据您的说法,“这部分代码很简单”。

于 2015-07-25T19:42:20.097 回答