【发布时间】:2016-03-06 00:12:46
【问题描述】:
gets 函数首先在 C99 中被弃用,最后在 C11 中被删除。然而,在 C 库中没有直接替代它。
fgets() 不是直接替换,因为它不会删除最终的'\n',文件末尾可能不存在该'\n'。许多程序员也弄错了。
有一个删除换行符的单行代码:buf[strcspn(buf, "\n")] = '\0';,但这并不重要,并且经常需要解释。它也可能效率低下。
这会适得其反。许多初学者仍然使用gets(),因为他们的老师很蹩脚,或者他们的教程已经过时了。
Microsoft 提出了gets_s() 和许多相关函数,但它并没有默默地截断过长的行,这种违反约束的行为并不完全简单。
BSD 和 GNU libc 都有 getline,在 POSIX 中标准化,通过 realloc 分配或重新分配缓冲区...
教初学者了解这个烂摊子的最佳方法是什么?
【问题讨论】:
-
POSIX
getline比fgets更重要。scanf和%[是另一种选择,尽管它有自己的缺陷。fgets对我来说似乎并不算太糟糕,它的优点是能够判断线路是否超出缓冲区。 -
@M.M 使用
puts,人们会问“但是gets有什么不好呢?”请记住,这个问题本质上是教学,而不是技术。 -
这将是解释
gets到底有什么不好的绝佳机会。初学者 C 教育必须包括对缓冲区溢出的讨论以及不这样做的重要性。 -
@M.M:
scanf绝对不是gets()的合适替代品。大小限制参数减一并且必须在格式字符串中明确指定,不雅到它的最大值!scanf_s稍好一些,但在 BSD 和 Linux 中不受支持,例如gets_s... -
好的,我相信委员会成员有时会阅读 stackoverflow,如果他们不阅读,则可能有证据表明他们为什么没有提供直接替代品或推荐的替代品。我也在问如何最好地教初学者这方面的知识。
标签: c language-lawyer glibc libc