getint函数

whdugh 2012-11-23 08:23:13
函数getint将输入的字符流分解成整数,且每次调用得到一个整数。getint需要返回转换后得到的整数,并且,在到达输入结尾时要返回文件结束标记。
该版本的getint函数在到达文件结尾时返回EOF,当下一个输入不是数字时返回0,当输入中包含一个有意义的数字时返回一个正值。
下面代码用到 getch函数 和 ungetch函数,有何妙处,不解?
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 = getch())
* pn = 10 * *pn + (c - '0');
*pn *= sign;
if(c != EOF) ?这里是干嘛的?
ungetch(c);
return c;
}
...全文
4431 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
LubbyCX 2015-02-12
  • 打赏
  • 举报
回复
soga~受教受教^^
cosmos3919 2015-02-10
  • 打赏
  • 举报
回复
之所以有
if (c != EOF
    ungetch(c);
是因为前面的for循环结束的条件是isdigit(c)为假,亦即读取了一个非数字的字符,如果这个字符既不是数字,又不是结束标记,那么就应该把该字符放回到输入中,以免影响getint下一次正确读入或其它程序调用输入。
天天看Code 2014-08-22
  • 打赏
  • 举报
回复
引用 6 楼 whdugh 的回复:
下面是完整 getint 函数使用的代码 输入一段字符串 1a23bc4 输出 是不是 1 23 4 这个函数怎么用啊 很困惑? 还有书上说 借助getch和ungetch两个函数 ,函数getint必须读入的一个多余字符就可以重新写回到输入中? 什么意思啊?
#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(void)
{
    return (bufp > 0) ? buf[--bufp] : getchar();
}

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

int main()
{
    int n, array[10];
    for (n = 0; n < 10 && getint(&array[n]) != EOF; n++)
        ;
    for (n = 0; n < 10; n++)
        printf("%d\n", array[n]);
    return 0;
}
如果输入1a23bc4的话,我运行了一下,只有array[0]=1. 当读到字符a的时候,array[1~9]都不会得到初始化。 函数可以这样用:每个数字用空格间隔起来 1 2 3 4 ……,这样会成功的打印出来。
天天看Code 2014-08-22
  • 打赏
  • 举报
回复
引用 11 楼 whdugh 的回复:
[quote=引用 10 楼 mymtom 的回复:] 函数没有问题, main函数里的用法有问题 C/C++ code? 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 #include <stdio.h> #include……
书上说 如果符号+或-的后面紧跟的不是数字,getint函数将把符号视为数字0的有效表达方式,这是为何?[/quote] 我觉得是这样的: if (c == '+' || c == '-') c = getch(); for (*pn = 0; isdigit(c); c = getch()) * pn = 10 * *pn + (c - '0'); 如果+、-号后面跟的不是数字,那么pn指向的值最终为0. 并且如果后面跟的是文件结束符,不用回退字符,直接返回EOF。
天天看Code 2014-08-22
  • 打赏
  • 举报
回复
楼主是在K&R C这本书上看到的例子吗?
我把作者的解释给你看看:
Pekary 2014-07-26
  • 打赏
  • 举报
回复
谢谢版主,我也在关注这个问题~
hoo_chsodene 2013-10-23
  • 打赏
  • 举报
回复
程序中的下面这行代码是多余的。
ungetch(c); /* 输入不是一个数字 */
pubforever 2013-02-23
  • 打赏
  • 举报
回复
谢谢版主啊, 今天刚好学到这儿。 baidu getint 就搜到这儿来了 看了你的回复,有点点明白了。(看书的时候我一直在想如果输入是非数字。再按书上的for (n = 0; n < 10 && getint(&array[n]) != EOF; n++),非数字字母在函数getint中已经被ungetch()压回到输入了,每次循环都以getint()返回0结束了,数组怎么能得到有效的赋值,10个数字都没被赋值了。)
whdugh 2012-11-25
  • 打赏
  • 举报
回复
引用 10 楼 mymtom 的回复:
函数没有问题, main函数里的用法有问题 C/C++ code? 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 #include <stdio.h> #include……
书上说 如果符号+或-的后面紧跟的不是数字,getint函数将把符号视为数字0的有效表达方式,这是为何?
prajna 2012-11-24
  • 打赏
  • 举报
回复
int getch(void); 應該是getc的wrapper Gets the next character (an unsigned char) from the specified stream and advances the position indicator for the stream. void ungetch(int); 應該是ungetc的wrapper The ungetc function pushes back the character c onto the input stream stream.
mymtom 2012-11-24
  • 打赏
  • 举报
回复
函数没有问题, main函数里的用法有问题

#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(void)
{
    return (bufp > 0) ? buf[--bufp] : getchar();
}
 
void ungetch(int c)
{
    if (bufp >= BUFSIZE)
        printf("ungetch: too many characters\n");
    else
        buf[bufp++] = c;
}
 
int main()
{
    int r, i, n, array[10];

    for (n = 0; i < 10; n++) {
        /* 跳过非数字 */
        while ((r = getint(&array[n])) == 0)
            getch();

        if (r == EOF)
            break;
    }

    for (i = 0; i < n; i++)
        printf("%d\n", array[i]);

    return 0;
}
漫步者、 2012-11-24
  • 打赏
  • 举报
回复
c != EOF判断是否是文件 结束符
whdugh 2012-11-24
  • 打赏
  • 举报
回复
引用 8 楼 mymtom 的回复:
输入流可以看做一个字符的队列。
大版主 我在6楼 贴了一段 怎么使用getint 的代码 还望指点 ?
mymtom 2012-11-24
  • 打赏
  • 举报
回复
输入流可以看做一个字符的队列。
whdugh 2012-11-24
  • 打赏
  • 举报
回复
引用 5 楼 mymtom 的回复:
if(c != EOF) /* 这里是干嘛的?c != EOF, 说明 19行里取出的c是一个非数字的字符,就把这个字符返回输入流(stdin) ungetch(c); 楼主程序用的getch不对啊,应该是getchar, 标准库里没有getch函数啊,好像也木有ungetch函数啊,倒是有一个ungetc
嗯 版主说的对的 这两个函数 是书上写的呢 ungetch 是把压回的字符送到缓冲区内 这个也叫 把字符返回 输入流(stdin)吧。 对输入流的概念有点模糊。
whdugh 2012-11-24
  • 打赏
  • 举报
回复
下面是完整 getint 函数使用的代码 输入一段字符串 1a23bc4 输出 是不是 1 23 4 这个函数怎么用啊 很困惑? 还有书上说 借助getch和ungetch两个函数 ,函数getint必须读入的一个多余字符就可以重新写回到输入中? 什么意思啊?
#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(void)
{
    return (bufp > 0) ? buf[--bufp] : getchar();
}

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

int main()
{
    int n, array[10];
    for (n = 0; n < 10 && getint(&array[n]) != EOF; n++)
        ;
    for (n = 0; n < 10; n++)
        printf("%d\n", array[n]);
    return 0;
}
mymtom 2012-11-24
  • 打赏
  • 举报
回复
if(c != EOF) /* 这里是干嘛的?c != EOF, 说明 19行里取出的c是一个非数字的字符,就把这个字符返回输入流(stdin) ungetch(c); 楼主程序用的getch不对啊,应该是getchar, 标准库里没有getch函数啊,好像也木有ungetch函数啊,倒是有一个ungetc
whdugh 2012-11-24
  • 打赏
  • 举报
回复
#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;
}
whdugh 2012-11-24
  • 打赏
  • 举报
回复
求大神 回复

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧