使用int从getword返回一个单词; binsearch中可能存在的拼写错误

时间:2012-08-21 15:48:16

标签: c return kernighan-and-ritchie

我终于完成了K& R,但遇到了另一个不清楚的代码。第6.3 / 6.4章

  1. 参考getword。它如何返回int,这应该是一个单词。我知道它会返回第一个字母[0]。但是在我看来,如果我想回复一个词,我会介绍像char * getword这样的东西。我是对的吗? int如何表明它是一个单词?

  2. 仍然关于getword:假设我输入“in”并且在空格之后我按下输入。 getword读取'i',因为它不是空格,isalpha所以第一个if被省略。那会发生什么?

  3. 我在binsearch中标记了这一行。难道你不认为它应该是高=中 - 1;有

  4. int getword(char *word, int lim) {
        char *w = word;
        int c;
    
        while (isspace(c = getch()))
        {}
        if (c != EOF) {
            *w++ = c;
        }
    
        if (!isalpha(c)) {
            *w = '\0';
            return c;
        }
        for ( ; --lim > 0; w++) {
            if (!isalnum(*w = getch())) {
                ungetch(*w);
                break;
            }
        }
        *w = '\0';
        return word[0];
    }
    

    /* binsearch: find word in tab[0]...tab[n-1] */
    struct key *binsearch(char *word, struck key *tab, int n)
    {
        int cond;
        struct key *low = &tab[0];
        struct key *high = &tab[n];
        struct key *mid;
        while (low < high) {
            mid = low + (high-low) / 2;
            if ((cond = strcmp(word, mid->word)) < 0)
                high = mid; /* [3] */
            else if (cond > 0)
                low = mid + 1;
            else
                return mid;
        }
        return NULL;
    }
    

2 个答案:

答案 0 :(得分:2)

high = mid是正确的。右边界不包括在内。请注意,最初high = &tab[n],即它指向tab中的最后一个元素。

答案 1 :(得分:2)

你是对的,如果函数会返回一个单词,那就更确切地说是char *getword()。然而,根据K&amp; R

  

函数值是单词的第一个字符,或文件结尾的EOF,如果不是字母,则为字符本身

返回int是可以的,就像在C中一样,一个字符就像int只有8位,在[-128,+ 127]范围内。

那么这个词会被归还? 在作为参数给出的char *word中。最初char *w获取word指针的副本,然后将读取的字符设置到w指向的内存中。

在输入缓冲区中"in "isspace将返回false,并为c分配非空格字符。然后,*w++将该字符放在单词( i )的位置[0],增加w指针(++)。 word[0]包含'i'。

!isalpha测试为false,因此跳过该部分。

然后从输入中读取字符并将其存储到下一个w位置,直到读取非字母数字条目(或达到限制lim) - 在此非字母数字的情况下,字符read实际上被放回输入缓冲区,w - 包含不需要的char - 不会递增(由于break)。然后,以下*w = '\0'将覆盖非alpha字符,并“关闭”C字符串(在C字符串中以具有0值的字符结束)。

在您的示例中,将{n}存储在w中,递增w,然后将''存储到w并执行!isalnum的代码,即打破环。然后,由于w在存储''后没有增加,*w = '\0'会替换空格,并“关闭”字符串。

[问题的另一半已被其他人回答]