免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 11144 | 回复: 30
打印 上一主题 下一主题

关于linux中ungetch函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-27 09:51 |只看该作者 |倒序浏览
最近在学《C程序设计语言》,看到第六章结构时,第三节给出的一段程序我始终无法通过编译,问题就在ungetch函数,编译时提示:undefined reference to `ungetch', 怎么也解决不了。代码如下,请大家帮忙看看,代码是书上的我没做过修改。问题就在最后一个函数里的ungetch函数

#include<stdio.h>
#include<ctype.h>
#include<string.h>

#define MAXWORD 100

struct key{
    char *word;
    int count;
}keytab[] = {
    "auto", 0,
    "break", 0,
    "case", 0,
    "char", 0,
    "const", 0,
    "continue", 0,
    "default", 0,
    "unsigned", 0,
    "void", 0,
    "volatile", 0,
    "while", 0,
};

#define NKEYS   (sizeof keytab / sizeof keytab[0])

int getword(char *, int);
int binsearch(char *, struct key *, int);

main()
{
    int n;
    char word[MAXWORD];

    while(getword(word, MAXWORD)!= EOF)
        if(isalpha(word[0]))
            if((n = binsearch(word, keytab, NKEYS)) >= 0)
                keytab[n].count++;
    for(n = 0; n < NKEYS; n++)
        if(keytab[n].count > 0)
            printf("%4d %s\n", keytab[n].count, keytab[n].word);
    return 0;
}

int binsearch(char *word, struct key tab[], int n)
{
    int cond;
    int low, high, mid;

    low = 0;
    high = n-1;
    while(low < high){
        mid = (low + high)/2;
        if((cond = strcmp(word, tab[mid].word)) < 0)
            high = mid -1;
        else if (cond > 0)
            low = mid +1;
        else
            return mid;
    }
    return -1;
}

int getword(char *word, int lim)
{
    int c, getchar(void);
    void ungetch(int);
    char *w = word;

    while(isspace(c = getchar()))
        ;
    if(c != EOF )
        *w++ = c;
    if(!isalpha(c)){
        *w = '\0';
        return c;
    }
    for( ; --lim > 0; w++)
        if(!isalnum(*w = getchar())){
            ungetch(*w);
            break;
        }
    *w = '\0';
    return word[0];
}

论坛徽章:
0
2 [报告]
发表于 2011-08-27 11:12 |只看该作者
ungetch()非标准函数,可使用ungetc()代替

论坛徽章:
0
3 [报告]
发表于 2011-08-27 11:14 |只看该作者
不知道这本书的作者是谁?写的程序写的这么烂

论坛徽章:
0
4 [报告]
发表于 2011-08-27 11:29 |只看该作者
回复 2# x5miao


   
   我改成ungetc了,但是编译时提示如下:
6_3.c: In function ‘getword’:
6_3.c:66:9: error: conflicting types for ‘ungetc’
/usr/include/stdio.h:697:12: note: previous declaration of ‘ungetc’ was here
   第66行就是这句:void ungetc(int);

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
5 [报告]
发表于 2011-08-27 12:05 |只看该作者
本帖最后由 MMMIX 于 2011-08-27 12:16 编辑
不知道这本书的作者是谁?写的程序写的这么烂
x5miao 发表于 2011-08-27 11:14



    第二作者就是 C 語言的創造者,同時兩個作者都是 UNIX 的創造者。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
6 [报告]
发表于 2011-08-27 12:10 |只看该作者
ungetch()非标准函数,可使用ungetc()代替
x5miao 发表于 2011-08-27 11:12



    ungetch() 是作者在 Sect. 4.3 定義的函數。

论坛徽章:
0
7 [报告]
发表于 2011-08-27 20:31 |只看该作者
回复 6# MMMIX


    果然正解,前面的练习没好好做的后果,谢谢六楼的回复

论坛徽章:
0
8 [报告]
发表于 2011-08-28 00:05 |只看该作者
回复 5# MMMIX

对不起,我把《C程序设计语言》和国内的那些《C语言程序设计》的书搞混了。

不过如果按照现在C标准的要求,大神写的这个程序的确很不规范啊——毕竟是二十多年前出版的书吧,比如main()函数的声明等等。

论坛徽章:
0
9 [报告]
发表于 2011-08-28 00:09 |只看该作者
回复  x5miao


   
   我改成ungetc了,但是编译时提示如下:
6_3.c: In function ‘getword’:
6 ...
uqzcpo 发表于 2011-08-27 11:29


那是因为标准头文件stdio.h里面对ungetc()的原型声明是
  1. int ungetc(char , FILE *);
复制代码
你在本程序中再声明的时候必须保持和原型声明相同

论坛徽章:
0
10 [报告]
发表于 2011-08-28 02:41 |只看该作者
回复  MMMIX

对不起,我把《C程序设计语言》和国内的那些《C语言程序设计》的书搞混了。

不过如果按 ...
x5miao 发表于 2011-08-28 00:05



    现在推荐的main写法是C99里的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP