我在学习K&R书。目前,我正在阅读函数getop()在第78页。我确实理解代码,但我需要澄清2件事。
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] in:
while ((s[0] = c = getch()) == ' ' || c == '\t')we循环背后的想法是跳过空格和水平选项卡,那么我们为什么要在s中保存'c‘呢?为什么作者不简单地写:
while (c= getch() == ' ' || c == '\t')我们以后不会使用空格和制表符,为什么我们需要在s[0]中保存c呢?这里对s[0]的需求是什么?
我的第二个问题是:
s[1] = '\0';为什么我们在这里将'\0‘(字符串的结尾)赋值给s[1]?
我已经读过一些以前在stackoverflow.com上发布的关于它的答案,但我并不完全相信!
关于上述问题的公认答案是:“因为函数可能在读取剩余的输入之前返回,所以它需要是一个完整的(终止的)字符串。”
好的。但是,如果输入在开头有一个空白,然后是一个操作数或操作符呢?在这种情况下,s[1] = '\0'会过早关闭字符串吗?难到不是么?
发布于 2015-10-23 10:38:08
在回答第一个问题时,在本例中,分配给s[0]是一种方便的编码快捷方式。c的值被复制到s[0]中,用于getch()读取的每个字符,而不管它将被使用还是丢弃。如果要丢弃它,没有什么大不了的;它将在while()循环的下一次迭代中被覆盖。如果要使用它,那么它已经被复制到目标数组s[]中的必要位置。
为了回答你的第二个问题,
但是,如果输入在开头有一个空白,然后是一个操作数或操作符呢?
注意,上一个while()循环防止在退出循环后空白字符(空格和制表符)出现在s[0]中。因此,在执行后
s[1] = '\0';s[]字符串将由一个既不是空格也不是制表符的字符组成,后面跟着字符串终止符。
在下一次声明中
if (!isdigit(c) && c != '.')
return c; /* not a number */如果该字符不是数字或小数点,则该函数将返回。这就是为什么必须终止字符串的原因。
发布于 2015-10-23 09:50:26
但是,如果输入在开头有一个空白,然后是一个操作数或操作符呢?在这种情况下,s1 = '\0‘会过早关闭字符串吗?难到不是么?
不,
i = 0;
if (isdigit(c)) /* collect integer part */
while (isdigit(s[++i] = c = getch()))这可以确保,如果有要读取的内容,它将被覆盖在\0上,正如i=0和s[++i]所表示的那样,存储在包含\0的s[1]中。
发布于 2017-07-12 06:48:33
关于你的第一个问题:
while ((s[0] = c = getch()) == ' ' || c == '\t')因为在s中保存'c‘有助于以高级方式存储第一个数字,因此我们可以从简单的i等于1开始我们的下一段代码。
i = 0;
if (isdigit(c)) /* collect integer part */
while (isdigit(s[++i] = c = getch()))以上代码用于存储从索引i=1开始的下一个字符串字符。
关于你的第二个问题:
我们做不到
s[0] = '\0';因为在那个时候,我们已经将第一个数字存储在
看见
(s[0] = c = getch())https://stackoverflow.com/questions/33299349
复制相似问题