首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >getop()函数K&R图书p 78

getop()函数K&R图书p 78
EN

Stack Overflow用户
提问于 2015-10-23 09:45:10
回答 4查看 1.8K关注 0票数 6

我在学习K&R书。目前,我正在阅读函数getop()在第78页。我确实理解代码,但我需要澄清2件事。

getop()的代码如下:

代码语言:javascript
复制
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:

代码语言:javascript
复制
 while ((s[0] = c = getch()) == ' ' || c == '\t')

we循环背后的想法是跳过空格和水平选项卡,那么我们为什么要在s中保存'c‘呢?为什么作者不简单地写:

代码语言:javascript
复制
while (c= getch() == ' ' || c == '\t')

我们以后不会使用空格和制表符,为什么我们需要在s[0]中保存c呢?这里对s[0]的需求是什么?

我的第二个问题是:

代码语言:javascript
复制
s[1] = '\0';

为什么我们在这里将'\0‘(字符串的结尾)赋值给s[1]

我已经读过一些以前在stackoverflow.com上发布的关于它的答案,但我并不完全相信!

关于上述问题的公认答案是:“因为函数可能在读取剩余的输入之前返回,所以它需要是一个完整的(终止的)字符串。”

好的。但是,如果输入在开头有一个空白,然后是一个操作数或操作符呢?在这种情况下,s[1] = '\0'会过早关闭字符串吗?难到不是么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-10-23 10:38:08

在回答第一个问题时,在本例中,分配给s[0]是一种方便的编码快捷方式。c的值被复制到s[0]中,用于getch()读取的每个字符,而不管它将被使用还是丢弃。如果要丢弃它,没有什么大不了的;它将在while()循环的下一次迭代中被覆盖。如果要使用它,那么它已经被复制到目标数组s[]中的必要位置。

为了回答你的第二个问题,

但是,如果输入在开头有一个空白,然后是一个操作数或操作符呢?

注意,上一个while()循环防止在退出循环后空白字符(空格和制表符)出现在s[0]中。因此,在执行后

代码语言:javascript
复制
s[1] = '\0';

s[]字符串将由一个既不是空格也不是制表符的字符组成,后面跟着字符串终止符。

在下一次声明中

代码语言:javascript
复制
if (!isdigit(c) && c != '.')
    return c; /* not a number */

如果该字符不是数字或小数点,则该函数将返回。这就是为什么必须终止字符串的原因。

票数 6
EN

Stack Overflow用户

发布于 2015-10-23 09:50:26

但是,如果输入在开头有一个空白,然后是一个操作数或操作符呢?在这种情况下,s1 = '\0‘会过早关闭字符串吗?难到不是么?

不,

代码语言:javascript
复制
i = 0;
if (isdigit(c)) /* collect integer part */
    while (isdigit(s[++i] = c = getch()))

这可以确保,如果有要读取的内容,它将被覆盖在\0上,正如i=0s[++i]所表示的那样,存储在包含\0s[1]中。

票数 1
EN

Stack Overflow用户

发布于 2017-07-12 06:48:33

关于你的第一个问题:

代码语言:javascript
复制
while ((s[0] = c = getch()) == ' ' || c == '\t')

因为在s中保存'c‘有助于以高级方式存储第一个数字,因此我们可以从简单的i等于1开始我们的下一段代码。

代码语言:javascript
复制
i = 0;
if (isdigit(c)) /* collect integer part */
    while (isdigit(s[++i] = c = getch()))

以上代码用于存储从索引i=1开始的下一个字符串字符。

关于你的第二个问题:

我们做不到

代码语言:javascript
复制
s[0] = '\0';

因为在那个时候,我们已经将第一个数字存储在

看见

代码语言:javascript
复制
(s[0] = c = getch())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33299349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档