fgets实施(K&R)

我是编程的新手,从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和谷歌,但无法弄明白。 谢谢!

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

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

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