- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
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/
我知道使用 GET 和 SET 函数的公共(public)变量的缺点/私有(private)变量的优点,但目前我正在使用 Ogre3D 开发自己的第一个“真实”游戏(C++)..同时,我有时需要 6-
我正在开发一个 GSM/GPRS 应用程序,它将每 10 秒报告一些值。我必须使用的 SIM 卡每月只有 15MB 可用数据。我使用的是 SIM900 GSM 芯片供您引用。 我到达服务器的方式是通过
这三者有什么区别:gets - 它获取带有 '\n' 的行gets.chomp - 它得到一行,但删除 '\n' 这样对吗? gets.chomp! 怎么样? 最佳答案 gets - 它得到一个末尾带
问题和我现在遇到的问题 脚本 顺便说一句,评论是挪威语的,如果它们看起来很奇怪哈哈 Connect-AzureAD #variabel $Users = Get-AzureADUser -All:$t
我现在面临的问题是获取一个 URL,如下所示: www.example.com/example.php?url=www.google.com 现在的问题是,如果我的网址中有一个 get,如下所示: w
我有一个 queryString 传递给 servlet 的 doGet() 方法,如下所示: count=9&preId0=-99&objId0=-99&preId1=-99&objId1=-99&
这是我在 Django 模板中的代码: {% for tag in tags %} {{ tag }} {% endfor %} 在view.py中: def tag_find(
我正在尝试在express.js中为我的网络应用程序创建一个路由系统,我需要知道是否需要使用app.get/post/put/delete.apply以编程方式设置多个功能对于一条路线。 也是如此 a
我正在通过示例查看 A.Mele Django,第 1 章 def post_list(request, category=None): object_list = Post.publishe
如果我想找到与IIS站点或应用程序关联的目录,我该怎么做? 我似乎无法从Get-Website和Get-WebApplication的对象的任何属性中找到任何允许我这样做的东西。 最佳答案 只需查看一
不知道发生了什么。当我执行以下代码时......它运行良好......但它产生了错误。如果我将以下内容粘贴到我的浏览器地址栏中并点击它,我会得到一个 URL。如果我通过 KRL http:get 输入
Curl 提供了一系列不同的带有 X 前缀的 http 方法调用,但也提供了不带 X 的相同方法。我两种都试过了,但我似乎无法弄清楚其中的区别。有人可以快速向我解释这两种操作有何不同吗? 最佳答案 默
request.GET.get 是什么意思?我在 Django 中看到类似的东西 page = request.GET.get('page', 1) 我认为它与类似的东西有关 « 它们是如
我正在从我的 Angular2 站点查询一些 Elasticsearch 服务器。为了帮助提高安全性,我们希望锁定对 GET 请求的访问权限。 Elasticsearch 支持带主体的 GET,但我在
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 4年前关闭。 Improve t
调用 HTable.get(List) 返回的 Result 数组的顺序是什么? ? 我的意思是,假设与输入列表的顺序相同是否正确? 最佳答案 结果数组中的顺序将与输入列表的顺序相同。与批处理方法一样
所以我有一个看起来像这样的 JSON 数组: var myData = { foo : { biz : 'baz', fig : 'tree' } }
我正在学习 Ajax、javascript 和 html,并且有一个应用程序可以触发“get”请求,然后再触发另一个“get”请求。这些请求是用户按下按钮的结果。在我的 servlet 中,我使用 T
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 6 年前。 Improv
运行以下 cmdlet 适用于组成员(Amer 域中的组)中的所有用户,无论列出的用户位于哪个域: Get-ADGroupMember -Server amer 但是,当尝试通过管道传输到 Get-
我是一名优秀的程序员,十分优秀!