K&R C 书上的例子 P83 中文版

smalldream 发布于 2015/01/25 12:14
阅读 261
收藏 2
getint()函数的要求:接收自由格式的输入,并执行转换,将输入的字符流分解为整数,每次调用得到一个整数。达到结尾时返回文件结尾标志EOF。
其中ungetch函数大致就是标准库的ungetc,
书上说它是把字符压入回输入中。如果是这样的话,那:
假如我输入 “  xy123”
前面的两个空格会被while (isspace(c = getch())); 屏蔽掉。 
这时c=getch(); c的值为x。    
c的值满足if条件(!isdigit(c) && c != EOF && c != '+' && c != '-')
执行ungetch(c)
就把c=x的值压回输入中。
函数结束
因为循环执行函数,下次执行函数时,c=getch();  c不是应该还为x吗?(从ungetch那来的)这不是无限死循环了吗?

不解啊,我到底是哪里理解错了

 
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
 
int getch(void);
void ungetch(int);
 
/*getint 函数:将输入中的下一个整型数赋值给*pn */
int getint(int* pn)
{
    int c, sign;
 
    while (isspace(c = getch())) /*跳过空白符*/
        ;
    if (!isdigit(c) && c != EOF && c != '+' && c != '-') {
        ungetch(c); /*输入不是一个数字 */
        return 0;
    }
    sign = (c == '-') ? -1 : 1;
    if (c == '+' || c == '-')
        c = getch();
    for (*pn = 0; isdigit(c); c = getch())
        * pn = 10 * *pn + (c - '0');
    *pn *= sign;
    if (c != EOF)
        ungetch(c);
    return c;
}
 
#define BUFSIZE 100
 
char buf[BUFSIZE];
int bufp = 0;
 
int getch()
{
    return (bufp > 0) ? buf[--bufp] : getchar();
}
 
void ungetch(int c)
{
    if (bufp >= BUFSIZE)
        printf("ungetch: too many characters\n");
    else
        buf[bufp++] = c;
}



加载中
0
skft
skft
调用getint的for循环的判断条件中还有n<SIZE啊。由于输入已经不是合法整数,最后就相当于将array数组全设置成了0。getint的目的并不是尝试从输入中解析出尽可能多的整数。
smalldream
smalldream
回复 @xiangziwad : 当输入不合法时,应该是一堆垃圾数吧,那合法的输入只包括四部分吗?空格,数字,+,-
skft
skft
回复 @smalldream : 不过没有提到对不合法字符如何处理,是跳过还是怎样?按照目前的实现是不跳过,那就是这种表现了。 ps:更正一下,当输入不合法时,array不一定会被初始化为0。
smalldream
smalldream
他的原话是“函数getline接受自由格式的输入,并执行转换,将输入的字符流分解成整数,且每次调用得到一个整数”,这该怎么理解?
0
聽雨人
聽雨人

void ungetch(int c);

看到c是什么类型了没有,任何char都可以转成0-255的int。你举得栗子x也会被转成int啊。
所以你getch出来的都是整形,不是整形除了符号外都被转成整形压到后面去了。
-22-32-55-9x6
这个出来应该是正的,这样的解析太奇葩了吧.


返回顶部
顶部