gpt4 book ai didi

c - 由于标准 C 委员会没有标准化 gets() 的简单替代品,它应该是什么?

转载 作者:太空狗 更新时间:2023-10-29 16:28:52 25 4
gpt4 key购买 nike

gets 函数首先在 C99 中弃用,最后在 C11 中删除。然而,在 C 库中没有直接替代它。

fgets() 不是直接替换,因为它不会去除最后的 '\n',它可能在文件末尾不存在。许多程序员也弄错了。

有一个单行代码可以删除换行符:buf[strcspn(buf, "\n")] = '\0';,但它很重要,经常需要一个解释。它也可能效率低下。

这是适得其反的。许多初学者仍然使用 gets(),因为他们的老师很蹩脚或者他们的教程已经过时。

Microsoft 提出了 gets_s() 和许多相关函数,但它并没有默默地截断超长的行,这种约束违反的行为并不十分简单。

BSD 和 GNU libc 都有 getline,在 POSIX 中标准化,它通过 realloc 分配或重新分配缓冲区...

教初学者了解这个烂摊子的最好方法是什么?

最佳答案

问题的性质是这样的,会有猜测和意见。但是我们可以从C99基本原理和C11标准中找到一些信息。

C99 rationale ,当 gets() 被弃用时,说明弃用它的以下原因:

Because gets does not check for buffer overrun, it is generally unsafe to use when its input is not under the programmer’s control. This has caused some to question whether it should appear in the Standard at all. The Committee decided that gets was useful and convenient in those special circumstances when the programmer does have adequate control over the input, and as longstanding existing practice, it needed a standard specification. In general, however, the preferred function is fgets (see §7.19.7.2).

我认为 gets_s() 也不能被视为替代方案。因为 gets_s() 是一个可选的接口(interface)。 C11 实际上推荐使用 fgets() 而不是 gets_s():

§K.3.5.4.1,C11 草案

The fgets function allows properly-written programs to safely process input lines too long to store in the result array. In general this requires that callers of fgets pay attention to the presence or absence of a new-line character in the result array. Consider using fgets (along with any needed processing based on new-line characters) instead of gets_s.

因此,fgets() 是 ISO C 中 gets() 的唯一真正替代品。fgets() 是等效的到 gets() 除了如果有缓冲区空间它会在换行符中读取。那么,是否值得引入一个比长期使用且广泛使用的 (fgets()) 界面略有改进的新界面?国际海事组织,不。

此外,很多现实世界的应用并不仅仅局限于 ISO C。所以有机会使用扩展和 POSIX getline() 等作为替代。

如果有必要在 ISO C 中找到编写解决方案,那么很容易围绕 fgets() 编写一个包装器,例如 my_fgets()删除换行符(如果存在)。

当然,向新手教授 fgets() 涉及解释潜在的换行问题。但是 IMO,它并不难理解,打算学习 C 的人应该能够很快掌握它。它(找到最后一个字符,如果它是字符“X”则替换它)甚至可以被认为是初学者的一个很好的练习。

因此,鉴于上述原因,我认为没有必要在 ISO C 中使用新函数来真正替代 gets()

关于c - 由于标准 C 委员会没有标准化 gets() 的简单替代品,它应该是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34031129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com