嗨,这是关于Kernighan和Ritchie关键字计数程序的问题(ANSI版第6章第3节)。我已将整个代码包含在下面的链接中。
当我尝试在任何C源代码上运行代码时,我没有得到任何输出。因此,为了查明问题,我在代码中的不同点打印了语句。终端窗口中程序的输出(当应用于自身时)现在看起来像这样:
./a.out < keywords.c
I've got past the beginning of the getword loop.
I've got past the beginning of the getword loop.
I'm past the word[0] condition.
Segmentation fault
当我使用另一种搜索方法(通过结构键数组进行线性搜索)时,我得到了相同输出的另一种组合,这次没有分段错误。通过printf语句的输出,我倾向于认为getword函数有问题。是什么导致了这些错误?
以下是包含二进制和线性搜索功能的整个代码:
答案 0 :(得分:4)
您的代码调用binsearch()
并尝试使用mid
访问数组tab
,但mid
从未初始化,因此您在那里死亡。
int binsearch (char * word, struct key tab[], int n) {
int cond;
int low, high, mid;
low = 0;
high = n -1;
// Missing setting mid here!
while (low <= high) {
if ((cond = strcmp(word,tab[mid].word)) < 0) // That's going to be bad...
答案 1 :(得分:1)
Mike正确诊断出分段错误是由mid
中使用未初始化的binsearch
引起的。
您的代码中的进一步错误(我不是100%确定我发现了所有错误)是:
getch()
错误,return (bufp > 0) ? BUFF[bufp--] : getchar();
返回索引bufp
的字符,如果是> 0
,但bufp
是存储的元素数量缓冲区,应该是--bufp
。 ungetch
中,测试if (bufp > BUFFSIZE)
应使用>=
。您永远找不到任何关键字的原因是(使用更常规的缩进和间距):
// You loop until you find a non-space character
while (isspace(c = getch())) {
;
}
// If it's not a letter, this is not a word, return here
if (!isalpha(c)) {
*w = '\0';
return c;
}
// If it was a letter, read the following letters and store them in the buffer
for ( ; --lim > 0; w++) {
if (!isalnum(*w = getch())) {
ungetch(*w);
break;
}
}
您永远不会存储任何单词的第一个字母,因此遇到volatile
时,只有olatile
存储在缓冲区中。
只需在*w++ = c;
和if
循环之间添加for
即可修复它,您的程序也能正常运行(同时修复了getch
和ungetch
)。