Подсчет вхождений в ключевом слове C: проблема, когда getch () не возвращает правильное значение - PullRequest
0 голосов
/ 17 апреля 2020

Я использую книгу программирования K & R c: http://www2.cs.uregina.ca/~hilder/cs833/Other%20Reference%20Materials/The%20C%20Programming%20Language.pdf и пытаюсь выполнить программу на стр. 109 в структурах Array. Так что здесь в основном мне придется подсчитывать вхождения каждого ключевого слова, отмеченного на вкладке struct key, из пользовательского ввода. Я не получаю никакого возврата к функции main (). Мой ввод теряется в функции getWord (). Пожалуйста, скажите мне, где я иду не так. Мой код указан ниже:

// Count occurences of each keyword from input
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define MAXWORD 100
#define BUFSIZE 100
#define NKEYS   (sizeof keytab / sizeof keytab[0])

struct key{
    char *word;
    int count;
}keytab[] = {
    "auto", 0,    //here each index has two elements i.e {"auto", 0}, {"break", 0}, .......
    "break", 0,
    "case", 0,
    "char", 0,
    "const", 0,
    "continue", 0,
    "default", 0,
    "unsigned", 0,
    "void", 0,
    "volatile", 0,
    "while", 0
};


int getWord(char *, int);
int binSearch(char *, struct key *, int);

//Count C keywords
int main(){
    int n;
    char word[MAXWORD];
    while(getWord(word, MAXWORD) != EOF){ //see what getWord actually returns each time
        printf("\nword[0]: %c\n", word[0]);
        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("\n%4d   %s\n", keytab[n].count, keytab[n].word);
        }
    }
    return 0;
}

int binSearch(char *word, struct key tab[], int n){
    int low, high, mid, cond;
    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;
}

char buf[BUFSIZE]; //buffer for ungetch
int bufp = 0; //next free position in buf

int getch(void){
    return (bufp>0) ? buf[--bufp] : getchar();
}

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

//get next word or character from input
int getWord(char *word, int lim){
    int c;
    int getch(void);
    void ungetch(int);
    char *w = word;
    while((isspace(c = getch())) != EOF)
        ;
    if(c != EOF){
        *w++ = c;
    }
    printf("c: %d\n", c);
    printf("\n*w: %c", *w);
    if(!isalpha(c)){
        *w = '\0';
        return c;
    }
    for( ; --lim > 0; w++){
        if(!isalnum(*w = getch())){
            ungetch(*w);
            break;
        }
    }
    *w = '\0';
    printf("word[0]: %c\n", word[0]);
    return word[0];
}


...