我是编程的新手,从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/