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

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 *传递给fgets函数,在该函数中我们存储用户输入。为什么需要声明本地char * cs-然后将其初始化为s?为什么我们不能在if语句中直接操作/添加到?看到cs初始化为指向s,将字符添加到cs难道不是一回事吗?

2)与以上内容紧密结合...当函数返回时,将进行测试以查看cs == s。为什么这是必要的?

我认为我可能缺少一些非常基本的内容-我确实检查过SO和Google,但不太清楚。谢谢!

最佳答案

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

通过在整个原始指针中使用cs,可以保留s。如果s是直接操纵的(*s++而不是*cs++),那么我们将不得不寻找另一种方法来检查是否读取了任何字符。

也可以说,将函数参数保留为单独参数并将其视为const是一个好习惯。一些程序员遵循此做法,以提高代码的清晰度。

关于c - fgets实现(K&R),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16397832/

10-12 07:36
查看更多