【发布时间】:2011-08-01 21:42:55
【问题描述】:
我正在学习 C,我正在尝试理解库。
例如,在 GNU C 库中,它给出:
——函数:char * fgets(char *s, int 计数,文件*流)
fgets 函数读取字符 从流向上 到并包括换行符 并将它们存储在字符串 s 中, 添加一个空字符来标记 字符串的结尾。你必须提供 计算 s 中值得空格的字符, 但读取的字符数是 最多计数 - 1. 额外的字符 空间用于保存空 字符串末尾的字符。
如果系统已经在文件末尾 当您调用 fgets 时,则 数组 s 的内容不变 并返回一个空指针。一个空 如果读取也返回指针 发生错误。否则返回 value 是指针 s。
警告:如果输入数据为空 性格,你说不出来。所以 不要使用 fgets 除非你知道 数据不能包含空值。不要使用 它读取用户编辑的文件 因为,如果用户插入一个 null 字符,你应该处理它 正确或打印明确的错误 信息。我们建议使用 getline 而不是 fgets。
但是,我仍然看到人们使用 fgets 从控制台收集输入而不是文件,例如:
fgets(line,sizeof(line),stdin);
sscanf(line,"%d",¤t); // read the input
有人可以向我解释我应该如何阅读和遵循 C 语言的语法吗?您应该通过模仿他人的代码来学习 C 还是通过实际引用库然后自己编写代码来学习 C?
干杯,
【问题讨论】:
-
注意:
fgets等做的和C语法无关,和标准库有关。 -
他们所说的 getline 函数here 是该特定库中的非标准扩展。我认为,对于可移植代码,你最好坚持使用 fgets。
-
@jonsca:好吧,
getline()被添加到 POSIX 2008 中。这使得它对于 vanilla c 仍然是非标准的,但在类 unix 系统上是标准的,fgets是可怕的。跨度> -
@dmckee 我一直认为可移植性是最重要的,但我理解你的意思。我从未见过 getline 的代码,所以我不知道它与实现有何联系。但是,我确实认为向不熟悉该语言的人强调 fgets 在安全性上优于不带字段宽度说明符的 gets() 或 scanf(使用 %s)是很重要的。
-
@jonsca:关于
fgets的安全性提高,您当然是对的。我已经使用纯 c89 库函数实现了getline语义,GNU 使它们的版本与它们的 libc 分开提供(尽管显然在 GPL 下)。
标签: c