求助,The C programing language书中的两点疑惑(getword函数和折半查找)
我看的是第二版,中文版。第一个疑问:
书的118页,getword函数是从输入中读取下一个单词,ungetch函数在书的前面章节,是为了把某个字符存放在缓冲区,避免丢失
程序代码:
int getword(char *word, int lim)
{
int c, getch(void);
void ungetch(int);
char *w = word;
while (isspace(c = getch()))
;
if (c != EOF)
*w++ = c;
if (!isalpha(c)) {
*w = '\0';
return c;
}
for ( ; --lim; w++)
if (!isalnum(*w = getch())) {
ungetch(*w);
break;
}
*W = '\0';
return word[0];
}
可为什么要声明一个指针w呢?看起来毫无必要啊,函数本来就是会生成参数word的一个拷贝不是吗?
第二个疑问:
120页,那个折半查找的函数
程序代码:
struct key *binsearch(char *word, struct 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;
else if (cond > 0)
low = mid + 1;
else
return mid;
}
return NULL;
}
为什么不用117页利用数组下标那种比较方式,这样写代码呢:
程序代码:
struct key *binsearch(char *word, struct key *tab, int n)
{
int cond;
struct key *low = &tab[0];
struct key *high = &tab[n - 1];
struct key *mid;
while (low <= high) {
mid = low + (high - low) / 2;
if ((cond = strcmp(word, mid->word)) < 0)
high = mid - 1;
else if (cond > 0)
low = mid + 1;
else
return mid;
}
return NULL;
}
我看了标准库里的函数,也用的是“<=”进行比较,并且在相应分支里给high赋值成mid-1
效果看起来是一样的,但我感觉这本书里这样别扭的比较是别有用意的,因为下面有一段话专门解释(正是这段解释让我一头雾水):tab[n]虽然越界,但是对它进行取地址是合法的操作。









