0

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

  1. 参考getword。它怎么能返回int,这应该是一个词。我知道它返回 word[0] 是第一个字母。但是在我看来,如果我想返回一个词,我会引入类似 char *getword 的东西。我对吗?
    int 如何表示它是一个单词?

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

  3. 我在 binsearch 中标记了该行。你不认为它应该是高 = 中 - 1;那里?

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;
}
4

2 回答 2

2

high = mid是正确的。不包括右边界。请注意,最初high = &tab[n],即它指向tab.

于 2012-08-21T15:57:47.510 回答
2

你是对的,如果函数会返回一个单词,那就是char *getword(). 然而,根据 K&R

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

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

那么这个词在哪里返回?
char *word给定的 as 参数中。最初char *w获取指针的副本word,然后将读取的字符设置到 指向的内存中w

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

!isalpha测试是错误的,因此该部分被跳过。

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

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

[另一半问题已经有人回答]

于 2012-08-21T16:17:06.113 回答