C程序设计语言(第2版)----课后练习题6-1

练习6-1 上述getword函数不能正确处理下划线、字符串常量、注释及预处理器控制指令。请编写一个更完善的getword函数。

/*题目的理解:
1.在得到word时,要把下划线'_'和字母数字作为word的一部分考虑
2.忽略字符串常量中的出现的关键词信息,或者说字符串常量里的文本信息统统过滤掉
3.注释内容全部过滤掉
4.不考虑预处理器控制指令中的文本信息(这一点我没加入到程序当中,其原理和前面的都一样)*/
#include
#include
#include

#define MAXWORD 100
struct key {
	char *word;
	int count;
}keytab[] = {
	"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(struct key))
int getword(char *word, int maxword);
int getch(void);
void ungetch(int c);
int binsearch(char *word, struct key keytab[], int n);

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

int getword(char *word, int maxword) {
	int c,leftnote,rightnote;//leftnote和rightnote用来判断是否接收到左注释符和右注释符;
	leftnote = 0;
	rightnote = 0;
	char *w = word;
	while ((c = getch()) == '\40' || c == '\t')
		;
	if (c != EOF) {
		*w++ = c;
	}
	if (!isalpha(c) && c!='_' && c!='"' && c!='/') {
		*w = '\0';
		return c;
	}
	if (c == '_') {
		for (; --maxword > 0 && isalnum(c = getch());)
			*w++ = c;
		ungetch(c);
	}
	else if (c == '"') {
		for (;(c = getch()) != '"';)
			;
	}
	else if (c == '/') {
		if ((c = getch()) == '/') {
			for (; (c = getch()) != '\n';)
				;
		}
		else if (c == '*') {
			leftnote = 1;
			while (leftnote == 1 && rightnote == 0) {
				for (; (c = getch()) != '*';)
					;
				if ((c = getch()) == '/')
					rightnote = 1;
			}
		}
	}
	else {
		for (; --maxword > 0 && isalnum(c = getch()) || c=='_';)
			*w++ = c;
		ungetch(c);
	}
	*w = '\0';
	return w[0];
}

#define BUFSIZE 1000
char buf[BUFSIZE];
int  bufp = 0;

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

void ungetch(int c) {
	if (bufp > BUFSIZE - 1)
		printf("error: full buf\n");
	else
		buf[bufp++] = c;
}

int binsearch(char *word, struct key keytab[], int n) {
	int low, middle, high;
	int cond;
	low = 0;
	high = n - 1;
	while (low <=high) {
		middle = (low + high) / 2;
		cond = strcmp(word, keytab[middle].word);
		if (cond < 0)
			high = middle - 1;
		else if (cond > 0)
			low = middle + 1;
		else
			return middle;
	}
	return -1;
}

你可能感兴趣的:(c程序设计语言)