getline 如何像使用 fgets 一样限制输入量

2024-03-29

GNU手册 https://www.gnu.org/software/libc/manual/html_node/Line-Input.html

这段话来自 GNU 手册

警告:如果输入数据有空字符,您将无法辨别。所以 除非您知道数据不能包含空值,否则不要使用 fgets。不 使用它来读取用户编辑的文件,因为如果用户插入 空字符,您应该正确处理它或打印一个清晰的 错误信息。我们建议使用 getline 而不是 fgets。

正如我通常所做的那样,我在提问之前会花时间搜索,我确实在五年前的 Stack Overflow 上发现了一个类似的问题:为什么 fgets 函数被弃用? https://stackoverflow.com/questions/16323185/why-is-the-fgets-function-deprecated

尽管 GNU 推荐getline over fgets,我注意到getline in stdio.h采取任何尺寸的线。它调用realloc如所须。如果我尝试将大小设置为 10 个字符:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char *buffer;
    size_t bufsize = 10;
    size_t characters;

    buffer = (char *)malloc(bufsize * sizeof(char));
    if( buffer == NULL)
    {
        perror("Unable to allocate buffer");
        exit(1);
    }

    printf("Type something: ");
    characters = getline(&buffer,&bufsize,stdin);
    printf("%zu characters were read.\n",characters);
    printf("You typed: '%s'\n",buffer);
    return(0);
}

在上面的代码中,输入任意大小的字符串(超过 10 个字符),getline 将读取它并给出正确的输出。

甚至没有必要malloc,就像我在上面的代码中所做的那样 -getline为你做。我将缓冲区大小设置为 0,并且getline will malloc and realloc根据需要为我服务。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char *buffer;
    size_t bufsize = 0;
    size_t characters;

    printf("Type something: ");
    characters = getline(&buffer,&bufsize,stdin);
    printf("%zu characters were read.\n",characters);
    printf("You typed: '%s'\n",buffer);
    return(0);
}

如果运行此代码,您可以再次输入任何大小的字符串,并且它可以工作。即使我将缓冲区大小设置为 0。

我一直在研究 CERT 指南中的安全编码实践www.securecoding.cert.org http://www.securecoding.cert.org

我正在考虑从fgets to getline,但我遇到的问题是我无法弄清楚如何限制输入getline。我认为恶意攻击者可以使用循环发送无限量的数据,并耗尽堆中所有可用的内存?

有没有办法限制输入大小getline使用或做getline函数内有一些限制吗?


使用 fgets 不一定有问题,所有 gnu 手册都告诉您,如果文件中有 '\0' 字节,那么缓冲区中也会有。您将无法判断缓冲区中的空分隔符是文件的实际结尾还是文件中的空分隔符。这意味着您可以将 100 个字符的文件读入 200 个字符的缓冲区,并且它将包含一个 50 个字符的 c 字符串。

事实上,stdio.h readline 似乎没有任何合理的长度限制,因此 fread 可能是可行的替代方案。

与C不同getline https://en.cppreference.com/w/c/experimental/dynamic/getline和C++std::getline() http://en.cppreference.com/w/cpp/string/basic_string/getline, C++ std::istream::getline() http://en.cppreference.com/w/cpp/io/basic_istream/getline仅限于count人物

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

getline 如何像使用 fgets 一样限制输入量 的相关文章

  • 为什么在 C# 中成员初始值设定项中不允许这样做,但在 VB.Net Me 中允许

    我正在将 VB Net 应用程序转换为 C 并注意到在 VB Net 代码中 有一个私有成员变量 它是使用Me像这样 Private m ClassA As New MyCollection Of ClassA Me 当我将其转换为 C 代
  • 中间件 API 的最佳实践是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我们正在开发一个中间件 SDK 采用 C 和 Java 语言 供游戏开发人员 动画软件开发人员 阿凡达开
  • 同步执行异步函数

    我对此主题进行了大量搜索 并且阅读了本网站上有关此主题的大部分帖子 但是我仍然感到困惑 我需要一个直接的答案 这是我的情况 我有一个已建立的 Winform 应用程序 但无法使其全部 异步 我现在被迫使用一个全部编写为异步函数的外部库 在我
  • OpenCV Visual Studio ntdll.dll

    我尝试在 Visual Studio 2013 上使用 OpenCV 2 4 10 创建一个项目 但由于以下异常 到目前为止我运气不佳 请建议帮助 TIA letstryitonemoretime exe Win32 Loaded C Us
  • CMake 和 Visual Studio:如何获得快速、安静的命令行构建?

    我有一个 cmake 项目 它成功地完成了我想要的一切 但我有大约 100 个文件 当我只需要重新编译一个文件时 我厌倦了每次看到生成的巨大输出 每个文件 30 行 明确地说 我正在编译cmake build 得到这个结果 我需要传递给编译
  • 将指针转换为浮点数?

    我有一个unsigned char 通常 这指向一块数据 但在某些情况下 指针就是数据 即 铸造一个int的价值unsigned char 指针 unsigned char intData unsigned char myInteger 反
  • C++ 中的单例和抽象基类

    最近我遇到了关于实现 Singleton 但涉及抽象基类的问题 假设我们有这样的类层次结构 class IFoo it s ABC class Foo public IFoo 我们的单例类定义如下 template
  • C++ 非类型参数包扩展

    我正在编写由单一类型参数化的模板函数 并且具有可变数量的相同类型 而不是不同类型 的参数 它应该检查第一个值是否在其余值中 我想这样写 include
  • 基于 MS Bot Framework 中的响应分支对话框/表单

    我们正在尝试使用 MS Bot Framework 但尚未完全弄清楚如何实现此场景 我们有一个 LUIS 对话框 类型 它工作正常并且经过适当的培训 以常见的三明治为例 LUIS 意图寻找的基本内容是用户询问订单状态 如果问题中提供了订单号
  • 将列表(对象)转换为列表(字符串)

    有没有办法转换List of Object to a List of String 在 c 或 vb net 中而不迭代所有项目 幕后迭代很好 我只想要简洁的代码 Update 最好的方法可能就是进行新的选择 myList Select f
  • 返回指向 std::vector 中的对象的 a

    我有一个关于返回对向量元素的引用的非常基本的问题 有一个向量vec存储类的实例Foo 我想访问这个向量中的一个元素 不想使用向量索引 我应该如何编码该方法getFoo here include
  • async wait 在调用异步方法时返回 Task> 而不是 List

    我正在尝试了解 async wait 的用法 并且研究了一些博客文章 现在我已经编写了一个测试代码 但它没有按照我期望的方式工作 我有一个返回列表的方法 private List
  • Symfony 5.4 Security Bundle,注册后无法登录

    我在 5 4 版本上构建空的新项目 我使用这些命令来构建项目 composer create project symfony skeleton 5 4 testapp54 cd testapp54 composer require weba
  • 如何防止字符串被截留

    我的理解 可能是错误的 是 在 C 中 当你创建一个字符串时 它会被实习到 实习生池 中 这保留了对字符串的引用 以便多个相同的字符串可以共享操作内存 但是 我正在处理很多很可能是唯一的字符串 一旦完成每个字符串 我需要将它们从操作内存中完
  • 为什么C++变量是指针时不需要正确定义?

    我对 C 语言完全陌生 特别是指针 经验主要是 PHP 并且希望对以下内容进行一些解释 我已经尝试寻找答案 这两行代码如何能够在我的程序中完成完全相同的工作 第二行似乎违背了我迄今为止所学到和理解的关于指针的一切 char disk 3 D
  • 如何使用 libpq 获取双精度值?

    The examples http www postgresql org docs 9 3 interactive libpq example htmllibpq 文档中展示了如何通过将整数值转换为主机字节序表示来获取整数值 我很好奇必须做
  • 在 try catch 块中返回到 catch 内是否不好?这是很好的做法

    在 try catch 块中从 C 中的 catch 块返回值是不好的做法吗 try Some code return 1 catch return 0 哪种使用 try catch 的方法是好的做法 不需要 只要返回的值是你想要的 你可以
  • 实体框架代理创建

    我们可以通过使用来停止在上下文构造函数中创建代理 this Configuration ProxyCreationEnabled false 在 EF 4 1 中创建代理有哪些优点和缺点 代理对于两个功能是必需的 延迟加载 导航属性在第一次
  • 在代码中而不是 XAML 中呈现 UserControl

    我想用RenderTargetBitmap将 UserControl 呈现为位图 而无需为其编写 XAML 当我这样做时 我得到一张空白图像 我是否错过了关键的一步 ValTool Controls VideoFisheyeOverlayC
  • 具有多种类型的 C# 泛型类型推断

    我有以下通用方法 用于将一种类型的输入对象序列化为超类型 如下所示 public string SerialiseAs

随机推荐

  • Django 无法加载模板标签

    我创建了一个templatetags我的应用程序内的文件夹和名为的文件内posts py 我写了以下代码 from django template import Library Node from advancedviews models
  • 如何检查 Jetpack Compose 中列表项的可见性

    FlatList of React Native有财产viewabilityConfigCallbackPairs您可以在其中设置 viewabilityConfig itemVisiblePercentThreshold 50 waitF
  • 从 csv 文件复制 cassandra 表

    我正在我的 Mac 带有 Oracle jdk1 7 0 55 的 Mac OS X Yosemite 上为 Cassandra Apache Spark 和 Flume 设置演示环境 该景观应作为新分析平台的概念证明 因此我需要在我的 c
  • SQL 计数(*) 性能

    我有一个包含超过 2000 万行的 SQL 表 BookChapters 它有一个聚集主键 bookChapterID 并且没有任何其他键或索引 运行以下查询需要几毫秒 if select count from BookChapters 0
  • 在 PHP 关联数组索引中使用空格是一种不好的做法吗?

    我必须使用关联数组传递一些参数 如下所示 blockGroup name products type complete 做了一些测试 我发现它有效 但这是一个不好的做法吗 是否有可能产生任何错误或意外行为 感谢您的任何建议 EDIT 1 我
  • FreeType“通用”与 c++/cx 关键字冲突

    我在将 c 和 c cx 放在一起时遇到问题 我需要使用 FreeType 库 但他们对某些变量使用 通用 名称 我还需要启用 VC 扩展 因为 WinRT 应用程序会导致名称冲突 通用是 c cx 中的关键字 1 gt freetype2
  • 如何查看eclipse“运行配置”使用的shell命令

    给定 Eclipse 中的 运行配置 我想打印出用于运行它的关联 shell 命令 例如 现在 在 Eclipse 中 如果我单击 播放 它将运行 mvn assembly directory Dmaven test skip true 我
  • 使用 SonarQube 进行多模块项目分析

    SonarQube Server 5 1 2 Sonar Runner 2 4 如提供的多模块项目 http docs sonarqube org display SONAR Analyzing with SonarQube Runner
  • 下划线充当分隔符 C# RTF Box

    我正在开发一个 Winforms 应用程序 并使用 RichTextBox 控件上的 Find 来查找要设置样式的特定关键字 由于某种原因 尽管指定了 WholeWord 标志 Find 似乎仍将其中带有下划线的单词视为 2 个单独的单词
  • Peewee MySQL 服务器消失了

    我用烧瓶和尿尿 有时 peewee 会抛出此错误 MySQL server has gone away error 32 Broken pipe Peewee 数据库连接 db PooledMySQLDatabase database pa
  • 对整数树求和 (Haskell)

    我正在尝试创建一个对非二叉整数树的值求和的函数 datastructures hs data Tree a Empty Node a Tree a deriving Eq Show myNums Num a gt Tree a myNums
  • 如何使基于列表的编辑器模板正确绑定到 POST 操作?

    我有一个模型 ApplicantBranchList 在更大的模型中用作属性 如下所示 Display Name Where would you want to work public ApplicantBranchList Prefere
  • 向 tm 结构添加一些间隔

    我有一个结构tm 我需要添加一些固定间隔 以xx年 xx月 xx天给出 到tm struct 有没有标准函数可以做到这一点 我使用的编译器是 Windows XP 上的 MSVC 2005 有两个转换时间格式的函数 mktime 哪个转换s
  • 组合选择器时,空格与没有空格的含义相同吗?

    在 CSS 中 选择器与空格的结合意味着后裔 http www w3 org TR CSS21 selector html descendant selectors 但在另一个答案中如何在CSS选择器中组合类和ID https stacko
  • phpStorm 与 php-cgi 的问题

    所以我最近换成了 ubuntu 我试图再次设置我的环境 我设法安装了 LAMP 和 phpmyadmin 和 phpstorm 但是我无法做的是从 phpStorm 运行 php 脚本 当我尝试运行该程序时 页面给我一个 502 Bad g
  • 从另一个页面链接到特定选项卡

    我有一个包含 3 个选项卡的表单 div class tabs ul class tabset li a class active span Shirts span a li li a href span Jeans span a li l
  • 带验证器的 Perl 工作流模块

    我正在尝试让 perl 工作流程模块工作 http search cpan org jonasbn Workflow http search cpan org jonasbn Workflow 我设法弄清楚它如何与工作流程 操作 条件等一起
  • 如何在 C++ 中对匿名对象使用运算符=?

    我有一个带有重载运算符的类 IPAddress IPAddress operator IPAddress other if this other delete data this gt init other getVersion other
  • 属性“dataSource”是必需的 java 中的错误(Spring)

    我正在开发一个网络应用程序Java 春季 我的java文件是这样的 try JdbcTemplate jt new JdbcTemplate dataSource System out println Connection jt toStr
  • getline 如何像使用 fgets 一样限制输入量

    GNU手册 https www gnu org software libc manual html node Line Input html 这段话来自 GNU 手册 警告 如果输入数据有空字符 您将无法辨别 所以 除非您知道数据不能包含空