fgets实施(K& R)

时间:2013-05-06 11:30:09

标签: 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;
}

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

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

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

1 个答案:

答案 0 :(得分:7)

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

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

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