0

我正在学习 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 获取的内容跟在数字字符或 a.之后,在这种情况下 c 可以是换行符或除 之外的其他字符EOF

很明显,这c并非EOF没有经过测试。

if(c != EOF)用来做什么的?

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

4

1 回答 1

0

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

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

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

它也可能是EOF。

很明显,未经测试,c 不是 EOF。

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

if(c != EOF) 是做什么用的?

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

PS 如果程序确实读取了 EOF,或者如果输入流包含超出 char 范围的正数部分的值,则程序具有未定义的行为...... isdigit 的参数应该始终是一个 int,但在这里它是一个 char。

于 2013-08-16T13:10:03.537 回答