if(c!= EOF)用于反向波兰计算器是什么?

时间:2013-08-16 08:03:42

标签: c eof

我正在学习C编程语言。

在下面的代码中

#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 characters\n");
    else
        buf[bufp++] = c;
}

我认为if(c != EOF)中的陈述getop()是不必要的。

在标准输入中,每一行由零个或多个字符组成,后跟换行符。

当语句执行时,c提取的内容跟在数字字符或.之后,在这种情况下c可以是换行符或除EOF之外的其他字符。

很明显c未经测试EOF

if(c != EOF)用于什么?

对不起,如果这是一个微不足道的问题。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

  

在标准输入中,每一行由零个或多个字符组成,后跟换行符。

不一定;输入是一个任意字节流,不必以换行符结尾。

  

当语句执行时,c取出的是数字字符或。,在这种情况下c可以是换行符或除EOF之外的其他字符。

也可能是EOF。

  

很明显,没有测试,c不是EOF。

不,不是;事实上,很明显c可能是EOF。

  

if(c!= EOF)用于什么?

防止ungetch(EOF),这是未定义的,因为EOF不能塞进buf。

P.S。如果程序读取EOF,或者输入流包含char范围的正部分之外的值,则程序具有未定义的行为... isdigit的参数应始终为int,但这里是char。