gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:38:26 26 4
gpt4 key购买 nike

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

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

  2. 关于 getword:假设我输入“in”,然后在空格后按下回车键。 getword 读作“i”,因为它不是空格,而 isalpha 则省略了第一个 if。那么会发生什么?

  3. 我在 binsearch 中标记了该行。你不觉得应该是 high = mid - 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;
}

最佳答案

你是对的,如果函数返回一个单词,它应该是 char *getword()。然而,根据 K&R

The function value is the first character of the word, or EOF for end of file, or the character itself if it is not alphabetic

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

那么这个词是从哪里返回的呢?
在作为参数给出的 char *word 中。最初char *w得到一份word指针,然后将读取到的字符设置到w指向的内存中。

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

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

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

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

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

关于c - 使用 int 从 getword 返回一个单词; binsearch 中可能的拼写错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12058590/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com