Я использую книгу программирования 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];
}