getword中的分段错误

时间:2012-12-04 15:51:40

标签: c segmentation-fault kernighan-and-ritchie

嗨,这是关于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函数有问题。是什么导致了这些错误?

以下是包含二进制和线性搜索功能的整个代码:

http://pastebin.com/sPEYYge6

2 个答案:

答案 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即可修复它,您的程序也能正常运行(同时修复了getchungetch )。