fgets实施(K&R)

drj*_*976 8 c pointers

我是编程的新手,从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;
}
Run Code Online (Sandbox Code Playgroud)

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

2)用以上内容绑定...当函数返回时,进行测试以查看cs == s.为什么这有必要?

我想我可能会遗漏一些非常基本的东西 - 我确实检查了SO和谷歌,但无法弄明白.谢谢!

Joh*_*ica 7

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

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

人们还可以争辩说,单独保留函数参数并将其视为一个很好的做法const.一些程序员遵循这种做法来提高代码清晰度.