gets
函数在C99中被首次弃用,并在C11最终被移除。但是,在C库中没有直接替代它的函数。
fgets()
不是一种完全替代的方法,因为它不会删除最后的'\n'
,而这个字符可能不存在于文件末尾。许多程序员也会犯错。
有一个简单的一行代码可以删除换行符:buf[strcspn(buf,"\n")]= '\ 0';
,但它并不简单,通常需要解释。这种方法也可能效率低下。
这种情况是适得其反的。许多初学者仍然使用gets()
,因为他们的老师过时或教程过时。
微软提出了gets_s()
和许多相关函数,但它不会静默截断过长的行,这种限制违约的行为不是很简单。
BSD和GNU libc都有getline
,在POSIX中进行了标准化,该函数通过realloc
分配或重新分配缓冲区......
如何向初学者介绍这个混乱局面是最好的方式?
getline
比fgets
更加复杂。使用%[
的scanf
是另一个选项,但它也有自己的缺陷。对我来说,fgets
似乎并不太糟糕,它的优点是能够告诉我们行是否超出了缓冲区。 - M.Mputs
,人们会问:“那么gets
有什么问题呢?”请记住,这个问题的性质是教学而不是技术性的。 - user824425gets
究竟有多糟糕的绝佳机会。初学者的C语言教育必须包括缓冲区溢出的讨论,并强调不要这样做的重要性。 - M.Mscanf
绝对不是gets()
的一个好替代品。它的大小限制参数偏差一,必须在格式字符串中明确指定,这样非常不优雅!scanf_s
稍微好一些,但在BSD和Linux上不受支持,就像gets_s
一样... - chqrlie