【发布时间】:2013-05-06 11:30:08
【问题描述】:
我是编程新手,从 Objective-C 开始,但我决定在进一步学习之前回到基础。我在 C 语言上花了一些时间,并且在指针混乱中苦苦挣扎。我的问题是关于 K&R 说 fgets 是如何实现的(p165,第 2 版。)下面的代码直接来自我的几个 cmets 的文本。
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 完全一样的事情?
2) 与上述绑定...当函数返回时,会进行测试以查看是否 cs == s。为什么需要这样做?
我认为我可能遗漏了一些非常基本的东西 - 我确实检查了 SO 和 Google,但无法完全弄清楚。谢谢!
【问题讨论】:
-
“从 Objective-C 开始,但决定在进一步发展之前回到基础” - 太好了,每个初学者都应该这样做。
-
我刚刚开始觉得我在 Obj-C 中取得了某种进展。自从回到 C 语言后,我又觉得自己像个彻头彻尾的笨蛋,但尽管我一再反对分段错误和奇怪的程序行为,但绝对值得付出努力。
-
绝对值得。掌握 C 对于理解 Objective-C 是不可避免的。