k&r getint.c 为什么输入字母或+(空格)5,程序就立即停止了?

题目描述

as written, getint treats a + or - not followed by a digit as a valid representation of zero. fix it to push such a character back on th input.

题目来源及自己的思路

来自K-R

相关代码

#include<ctype.h>
#include<stdio.h> 
#define SIZE 100
 
int getch(void);
void ungetch(int c);
/* getint : get next integer from input into *pn */
int getint(int *pn)
{
    int c,sign=1;
    int d;
    while(isspace(c = getch()))        /*skip space */
        ;
    if(!isdigit(c) && c!=EOF && c!='-' && c!='+')
    {
        ungetch(c);
        return c;            /* It is not a integer */
    }
    sign = (c == '-')? -1: 1;
    if(c == '-' || c == '+')
    {
        d = c;
        if(!isdigit(c = getch()))
        {
            if( c != EOF)
                ungetch(c);
            ungetch(d);
            return d;
        }    
    }
    for(*pn = 0; isdigit(c); c =getch())
        *pn = 10 * *pn + (c - '0');
    *pn *= sign;
    if( c != EOF)
        ungetch(c);
    return c;         
}
int main()
{
        int n;
    int array[SIZE];
    int last = 0;
    int j;

    int getint(int *pn);

    for(n = 0; n < SIZE && getint(&array[n]) != EOF; n++)
        ;
    for(last =n ,j = 0; j < last; j++)
        printf("%d\t",array[j]);
    printf("%d",j);
    return 0;
}
#define BUFSIZE 100
int buf[BUFSIZE];    /* buffer */
int bufp = 0;
int getch(void)
{
    if( bufp > 0)
        return buf[--bufp];
    else
        return getchar();  
}
void ungetch(int c)
{
    if(bufp < BUFSIZE)
        buf[bufp++] = c;
    else
        printf("error : too many characters\n");
}

你期待的结果是什么?实际看到的错误信息又是什么?

当我输入:
// - 5
或者
// + 5
以及字母时,程序就会立即停止,请问这是为什么?

if(c == '-' || c == '+')
{
    d = c;
    if(!isdigit(c = getch()))
    {
        if( c != EOF)
            ungetch(c);
        ungetch(d);
        return d;
    }    
}

这部分我觉得逻辑行得通啊?
当输入: + 5
它存储在缓存区的不就是:(空格)+5吗?
我特意在main函数中加了一个变量j来确定调用了多少次getint函数,发现它调用100次,可为有些数组元素没有被赋初值呢?getint函数中不是有这个语句吗?

for(*pn = 0; isdigit(c); c =getch())
        *pn = 10 * *pn + (c - '0');

真心求解,希望能得到解答,谢谢!

阅读 2.7k
2 个回答
本来想继续追问的,我一步一步地写下来(就是下面的),然后。。。。。
比如:当输入+(空格)5(再按enter)的时候,在getint函数中,不是先c='+';**然后isspace()不成立,然后下面这个if条件不成立,然后sign=1;然后下的if条件成立,然后 d=c; 然后 c=' '; 然后因为空格不是数字并且不等于EOF ,ungetch(c),空格先存进缓存区,然后ungetch(d),'+'存进缓存区;并且return c;返回 '+' 给main,'+' != EOF,继续循环;调用getint函数,c=getch()令c='+';**然又是这样(加粗的),main里的while循环SIZE遍,但数组array再也没有被赋值,所以有很数组元素的值是随机素。
输入字母之类的也是一样的。

我copy,编译运行了,可以正常运行啊。。
不过你这程序写的。。。。。。有点搞笑2333

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏