我终于完成了K& R,但遇到了另一个不清楚的代码。第6.3 / 6.4章
参考getword。它如何返回int,这应该是一个单词。我知道它会返回第一个字母[0]。但是在我看来,如果我想回复一个词,我会介绍像char * getword这样的东西。我是对的吗? int如何表明它是一个单词?
仍然关于getword:假设我输入“in”并且在空格之后我按下输入。 getword读取'i',因为它不是空格,isalpha所以第一个if被省略。那会发生什么?
我在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;
}
答案 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'
会替换空格,并“关闭”字符串。
[问题的另一半已被其他人回答]