C程序设计语言5.1练习题求助

时间:2020-11-27 00:12:23

/* getint: get next integer from input to *pn */
int getint(int *pn)
{
    int c, sign;
    while (isspace(c = getch())) {  /*  skip white spaces, ' ', '\t', '\n'*/
        ;
    }
    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 * *pn;
    if(c !=EOF)
        ungetch(c);
    return c;
}

#define BUFSIZE 100
char buf[BUFSIZE];
int bufp = 0;
int getch(void)
{
    return (bufp > 0) ? buf[--bufp] : getchar();
}

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


题目:在上面的例子中,如果符号+或-的后面紧跟的不是数字,getint函数将把符号视为0的有效表达方式。修改函数,把+或-符号重新写入输入流中。
(程序在下面)
如果我输入:123 ---- 456 6 8 89
结果为:
array[0] = 123
array[1] = 999
array[2] = 999
array[3] = 999
array[4] = 999
array[5] = -4
array[6] = -5
array[7] = -6
array[8] = 999
array[9] = -6
可是当输入两个减号后缓冲区不就一直就--吗?他们两个不停的取出再放入,一直这样做下去。哪里理解错了。我把初始值给的999

# include <stdio.h>
# include <ctype.h>
# define SIZE 10

int getch(void);
void ungetch(int);
int getint(int *);

int main (void)
{
    int n, r, array[SIZE];
    for(int i = 0; i < SIZE; i++)
    {
        array[i] = 999;
        //printf("array[%d] = %d\n", i, array[i]);
    }
    for(n = 0; n < SIZE; n++)
    {
        if ((r =getint(&array[n])) == 0) {
            getch();
        }
        if (r == EOF) {
            continue;
        }
    }
    for(int i = 0; i < SIZE; i++)
    {printf("array[%d] = %d\n", i, array[i]);}
    return 0;
}

/* fetint: get next integer from input to *pn */
int getint(int *pn)
{
    int c, d, sign;
    while (isspace(c = getch())) {  /*  skip white spaces, ' ', '\t', '\n'*/
        ;
    }
    if (!isdigit(c) && c != EOF && c != '-' && c != '+') {
        ungetch(c);
        return 0;
    }
    sign = (c == '-') ? -1 : 1;
    if (c == '-' || c == '+') {
        d = c;
        while (!isdigit(c = getchar())) {
            if (c !=EOF) {
                ungetch(c);
            }
            ungetch(d);
                        
            return d;
        }
    }
    for (*pn = 0; isdigit(c); c = getch()) {
        *pn = 10 * *pn + (c - '0');
    }
    *pn = sign * *pn;
    if(c !=EOF)
        ungetch(c);
    return c;
}

#define BUFSIZE 100
char buf[BUFSIZE];
int bufp = 0;
int getch(void)
{
    if (bufp > 0) {
        return buf[--bufp];
    }
    else
    {
        return getchar();
    }
    
}

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

3 个解决方案

#1


该回复于2013-08-18 13:47:46被管理员删除

#2


想了很久啊。。。。。

#3


没看明白lz的问题的意思

#1


该回复于2013-08-18 13:47:46被管理员删除

#2


想了很久啊。。。。。

#3


没看明白lz的问题的意思