9

我是编程新手,从 Objective-C 开始,但决定在进一步发展之前回到基础。我在 C 语言上花了一些时间,并且在指针混乱中苦苦挣扎。我的问题是关于 K&R 说 fgets 是如何实现的(p165,第 2 版)。下面的代码直接来自文本,并附有我的一些评论。

char* fgets(char* s, int n, FILE *iop)
{
    register int c;
    register char* cs;
    cs = s;

    while(--n > 0 && (c = getc(iop)) != EOF)
    {
    // put the input char into the current pointer position, then increment it
    // if a newline entered, break
    if((*cs++ = c) == '\n')
        break;          
    }

    *cs = '\0';
    return (c == EOF && cs == s) ? NULL : s;
}

1) 我们将一个 char* s 传递给 fgets 函数,我们在其位置存储用户输入。为什么需要声明本地 char* cs - 然后将其初始化为 s?为什么我们不能在 if 语句中直接操作/添加到 s ?看到 cs 被初始化为点 s,将字符添加到 cs 不是完全相同的事情吗?

2) 与上述绑定...当函数返回时,会进行测试以查看cs == s。为什么这是必要的?

我想我可能遗漏了一些非常基本的东西——我确实检查了 SO 和谷歌,但不能完全弄清楚。谢谢!

4

1 回答 1

7

这是因为最后一行的检查,cs == s. 此比较检查修改后的指针cs与原始指针s是否已读取任何字符。如果我们没有,那么我们返回 NULL。

通过使用cs整个原始指针s被保留。如果s被直接操作(*s++而不是*cs++),那么我们必须找到另一种方法来检查是否读取了任何字符。

人们也可以争辩说,不理会函数参数并将它们视为const. 一些程序员遵循这种做法作为提高代码清晰度的一种方式。

于 2013-05-06T11:33:36.987 回答