我是编程新手,从 Objective-C 开始,但决定在进一步发展之前先回到基础知识。我花了一些时间在 C 上,并且正在努力克服指针混乱。我的问题是关于 K&R 所说的 fgets 是如何实现的(第 165 页,第二版)。下面的代码直接来自文本,并附有一些我的评论。
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 语句中直接操作/添加到 s ?既然cs被初始化为点s,那么将字符添加到cs不是完全相同的事情吗?
2) 与上面的联系在一起...当函数返回时,将进行测试以查看 cs == s 是否。为什么这是必要的?
我想我可能错过了一些非常基本的东西 - 我确实检查过SO和Google,但不太明白。谢谢!
这是因为最后一行的检查,cs == s
。此比较检查修改后的指针cs
反对原来的s
看看我们是否读过任何字符。如果没有,那么我们返回 NULL。
通过使用cs
整个原始指针s
被保留。如果s
被直接操纵(*s++
代替*cs++
)那么我们就必须找到另一种方法来检查是否读取了任何字符。
人们还可以争辩说,保留函数参数并将它们视为一种很好的做法const
。一些程序员遵循这种做法来提高代码清晰度。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)