无法弄清楚函数的调用方式。
输入1 2 3 + + [Enter] //注意输入之间有空格
输出6 //这是正确的
1 - >当程序编译时,语句调用函数getop(s)。
2 - >在getop()函数中,它将调用getch()函数,该函数又调用getchar(),因此在此步骤中它将读取1作为输入并返回它。
3 - >现在它检查c是否为数字,这是真的,所以它将再次调用getch()读取空间,返回其值,现在它检查它是否为数字,否则被评估为false,然后它移动到下一个语句。
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
}
}
推送和弹出功能的定义很容易,所以我不写它
#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;
}
答案 0 :(得分:3)
4 - &gt;最后将执行ungetch(),在缓冲区中保存1
不,对ungetch
的来电通过c
,此时此行包含空格' '
。因此getop
返回NUMBER
,s
为"1"
,未处理的输入为" "
buf
(或更确切地说buf = { ' ', ... }
, bufp = 1
中的"2 3 + +\n"
)和stdin
。
ungetch
将字符添加到buf
。如果字符getch
不为空,则buf
会移除并返回字符;如果buf
为空,则会直接从stdin
(通过getchar
)读取。
这两个函数的目的是能够“读取”未读出的字符,即能够在读完一个字符之后确定你实际上并不想处理它,所以你把它放回去(要返回)下次你读输入时)。这允许您在输入中“向前看”。
例如,在阅读"42+..."
之类的输入时,首先需要提取数字42
。要做到这一点,首先要阅读角色'4'
。但你不能就此止步,因为在第一个数字之后,可能会有更多数字跟随。所以你读下一个字符'2'
,这很好,因为它也是一个数字。但是你点击+
,这不是一个数字而不是数字的一部分。因此,此时您停止处理输入,因为您知道完整的数字是42
,但您需要了解您刚刚阅读的+
。你需要保留它,以便下一个输入操作可以返回它(否则我们只是默默地丢弃它,这对用户来说会非常混乱)。因此,您致电ungetch('+')
并继续处理42
,因为您知道下一个getch()
将会收到您刚刚放回的+
。
我不能告诉你实际计算是如何完成的,因为你没有向我们展示那些代码,但据你说“这部分代码很简单”。