• 第六章 结构


    6.4 指向结构的指针

    #include <stdio.h>
    #include <ctype.h>
    #include <string.h>
    #define MAXWORD 100
    //int binsearch(char *, struct key *, int);
    #define NKEYS (sizeof keytab / sizeof(keytab[0]))
    #define BUFSIZE 100
    int getword(char *, int);
    char buf[BUFSIZE];
    int bufp = 0;
    
    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
    };
    /* count C keywords */
    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
    ", keytab[n].count, keytab[n].word);
    
        return 0;
    }
    
    /* binsearch: find word in tab[0]...tab[n-1] */
    
    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;
    }
    
    /* getword: get next word or character from input */
    
    int getword(char *word, int lim)
    {
        int c, getch(void);
        void ungetch(int);
        char *w = word;
        while (isspace(c = getch()))
            ;
        if (c != EOF)
            *w++ = c;
        if (!isalpha(c)) {
            *w = '';
            return c;
        }
        for ( ; --lim > 0; w++)
            if (!isalnum(*w = getch())) {
                ungetch(*w);
                break;
        }
        *w = '';
        return word[0];
    }
    int getch(void) /* get a (possibly pushed-back) character */
    {
        return (bufp > 0) ? buf[--bufp] : getchar();
    }
    void ungetch(int c) /* push character back on input */
    {
        if (bufp >= BUFSIZE)
            printf("ungetch: too many characters
    ");
        else
            buf[bufp++] = c;
    }
    终端输出显示:
    da
    gfa
    ray
    allen
    auto
    void
    los
    static
    register
    break
    ls
    case
    void
    auto
    break
    continue
       2 auto
       2 break
       1 case
       1 continue
       2 void
  • 相关阅读:
    mybatis 框架 的应用之四(一对一 与 一对多)
    mybatis 框架 的应用之三(操作两张没有关联的表,存在主键和外键关系)
    mybatis 框架 的应用之二(批量添加、实现分页查询)
    hibernate 框架的简单使用
    Java c3p0 连接 MySQL
    Oracle 复制表
    web 应用中访问 Spring 具体实现
    oracle 创建表 外键约束
    oracle 通过序列实现某字段自增
    Swift数组的sort、filter、forEach、map等方法,$的使用
  • 原文地址:https://www.cnblogs.com/try-again/p/5028928.html
Copyright © 2020-2023  润新知