我是编程的新手,从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和谷歌,但无法弄明白。谢谢!
答案 0 :(得分:7)
这是因为检查了最后一行cs == s
。此比较检查修改后的指针cs
与原始s
,以查看我们是否已读取任何字符。如果我们没有,那么我们返回NULL。
在整个原始指针cs
中使用s
会被保留。如果s
被直接操纵(*s++
而不是*cs++
),那么我们必须找到另一种方法来检查是否有任何字符被读取。
还可以说,单独保留函数参数并将其视为const
是一种很好的做法。一些程序员遵循这种做法来提高代码清晰度。