【发布时间】:2015-10-23 09:45:10
【问题描述】:
我正在学习 K&R 书籍。目前我正在阅读第 78 页的函数 getop()。 我确实了解代码,但我需要澄清两件事。
getop()的代码如下:
int getch(void);
void ungetch(int);
/* getop: get next character or numeric operand */
int getop(char s[])
{
int i, c;
while ((s[0] = c = getch()) == ' ' || c == '\t')
;
s[1] = '\0';
if (!isdigit(c) && c != '.')
return c; /* not a number */
i = 0;
if (isdigit(c)) /* collect integer part */
while (isdigit(s[++i] = c = getch()))
;
if (c == '.') /* collect fraction part */
while (isdigit(s[++i] = c = getch()))
;
s[i] = '\0';
if (c != EOF)
ungetch(c);
return NUMBER;
}
我的问题是关于:s[0] 在:
while ((s[0] = c = getch()) == ' ' || c == '\t')
while 循环背后的想法是跳过空格和水平制表符,那么我们为什么要在 s[0] 中保存 'c' 呢?为什么作者不简单地写:
while (c= getch() == ' ' || c == '\t')
我们以后不会使用空格和制表符,为什么我们需要将c保存在s[0]中呢?这里需要s[0]是什么?
我的第二个问题是:
s[1] = '\0';
为什么我们在这里将'\0'(字符串结尾)分配给s[1]?
我已经阅读了 stackoverflow.com 上发布的一些关于它的先前答案,但我并不完全相信!
关于上述问题的公认答案是:“因为函数可能会在读取剩余输入之前返回,因此 s 需要是一个完整的(和终止的)字符串。”
好的。但是,如果输入的开头有一个空格,然后是操作数或运算符怎么办?在这种情况下,s[1] = '\0' 会过早关闭字符串吗?不是吗?
【问题讨论】: