scanf("%[^\n]s",a) 与 gets(a)

2023-11-27

有人告诉我,当用户输入字符串时不应使用 scanf 。相反,大多数专家以及 StackOverflow 上的用户都使用 gets()。我从来没有在 StackOverflow 上问过为什么不应该使用 scanf 而不是 gets 来处理字符串。这不是实际的问题,但非常感谢对此问题的回答。

现在进入实际问题。我遇到过这种类型的代码 -

scanf("%[^\n]s",a); 

这将读取一个字符串,直到用户输入一个新行字符,并将空格也视为字符串。

如果我使用有什么问题吗

scanf("%[^\n]s",a);

而不是得到?

听起来比 scanf 函数更优化,gets 纯粹专用于处理字符串。请让我知道这一点。

Update

This链接帮助我更好地理解它。


gets(3)是危险的,应该不惜一切代价避免。我无法想象它的用途gets(3) is not安全缺陷。

scanf(3)'s %s这也是危险的——您必须使用“字段宽度”说明符来指示已分配的缓冲区的大小。如果没有字段宽度,这个例程就和gets(3):

char name[64];
scanf("%63s", name);

GNU C 库提供了a modifier to %s为您分配缓冲区。这个不可移植的扩展可能不太难正确使用:

   The GNU C library supports a nonstandard extension that
   causes the library to dynamically allocate a string of
   sufficient size for input strings for the %s and %a[range]
   conversion specifiers.  To make use of this feature, specify
   a as a length modifier (thus %as or %a[range]).  The caller
   must free(3) the returned string, as in the following
   example:

       char *p;
       int n;

       errno = 0;
       n = scanf("%a[a-z]", &p);
       if (n == 1) {
           printf("read: %s\n", p);
           free(p);
       } else if (errno != 0) {
           perror("scanf");
       } else {
           fprintf(stderr, "No matching characters\n"):
       }

   As shown in the above example, it is only necessary to call
   free(3) if the scanf() call successfully read a string.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

scanf("%[^\n]s",a) 与 gets(a) 的相关文章

随机推荐

  • 如何使用高阶函数求对角线的总和?

    考虑以下二维数组 let array 11 2 4 4 5 6 10 8 12 我想要得到的是对角线的总和 As firstDiagnal 11 5 12 4 As secondDiagnal 4 5 10 19 我可以使用标准来实现它fo
  • 使用 Gunicorn 服务时 Flask 超时

    我有一个可以将音频文件转换为文本的应用程序 使用烧瓶和烧瓶插座 当我使用 python run py 运行它时 它工作得很好 但是当我使用 gunicorn k eventlet b 0 0 0 0 5000 run app 运行它时 它将
  • 如何使对话框(视图)在与主窗口相同的监视器上打开

    在具有多个显示器的 PC 中 假设您运行的应用程序除了主窗口 例如选项 之外还有第二个窗口 对话框 您希望它在与您的计算机相同的屏幕 显示器中打开MainWindow 如何强制这种行为 你基本上想要阻止你的场景MainWindow在一台显示
  • git 是否需要存在于服务器上才能使用它?

    当我开始使用 git 时 我的同事告诉我的最显着的好处之一是git 不需要出现在服务器上反对svn 但这真的是真的吗 在另一个线程我读到至少有一个git upload pack or git receive pack将是必要的 另一方面 我
  • 如何在使用 Chrome 浏览器的 Selenium Web 驱动程序执行自动化测试时绕过 NTLM 身份验证弹出窗口?

    我使用以下 python 代码绕过 NTLM 弹出窗口 chromedriver webdriver Chrome executable path chromedriver path chrome options options chrom
  • maxItemsInObjectGraph 被忽略

    我的 WCF 服务出现问题 该服务尝试序列化过多的数据 从跟踪中我收到一个错误 指出可以序列化或反序列化的最大元素数为 65536 请尝试增加 MaxItemsInObjectGraph 配额 所以我去修改了这个值 但它只是被忽略了 错误是
  • 创建自定义 PSObject PowerShell 2.0

    是否可以创建一个自定义对象 PSObject 并在程序执行之前和之后定义其属性 我们不断向该对象添加值数组 For e g c c New Object PSObject c Add Member type NoteProperty nam
  • emacs 字符串插入矩形数字向量?

    如何使用 emacs string insert rectangle 操作将数字向量添加到一系列行中 例如 我的 emacs 缓冲区中有一堆文本条目的缩短版本 element01 8 1111111110110100001000000011
  • C++、OpenCV:调整大小时断言失败

    作为一名 C 初学者 我目前面临着一个我无法解决的问题 即使代码非常简单 我一直在寻找answers互联网上到处都是 但没有一个适用于我的问题 我目前正在 VS2013 下使用 OpenCV 2 4 8 用 C 编写基本的 SVM 我能够处
  • OpenSSL::SSL::SSLContext SNI servername_cb 不工作

    正如中所引用的OpenSSL X509 证书显示错误域名的证书 我需要使用 TLSv1 或更高版本and 服务器名称指示扩大 即使ssl version and servername cb通过设置SSLContext 我仍然收到错误的证书m
  • 动态创建一个继承自ActiveRecord的类?

    我希望能够动态创建继承自 ActiveRecord 的类 以便在 Rails 应用程序外部编写脚本 我被困在这样的事情上 require active record def create arec table name Class new
  • 如何在graphql和strapi中传递JSON对象

    当我手动编写突变查询 在 graphql 插件中 时 它正在工作 mutation createExam input data name myName desription ggg questions gf hello time 2 sub
  • Java Web 服务返回带有 > 和 < 而不是 > 和 < 的字符串

    我有一个返回字符串的 java web 服务 我正在创建这个 xml 字符串的主体DocumentBuilder and Document班级 当我查看返回的 XML 源 在浏览器窗口中看起来很好 而不是 时 它返回 lt and gt 围
  • Git 类似于 Hg 的 Bigfiles 扩展?

    我想要 git 中类似的东西Mercurial 的 Bigfiles 扩展 注 据我所知git 大文件 但这无关 基本上我想在我的 git 存储库中存储大型二进制文件 但我不想在进行克隆时获得大型二进制文件的每个版本 我只想在签出包含这些大
  • 使用 ReferenceEquals 的 IEqualityComparer

    有默认的吗IEqualityComparer
  • 可能有 ``a < b and not(a - b < 0)`` 带浮点数

    Is a lt b and not a b lt 0 由于浮点轮误差可能导致浮点吗 有例子吗 这个答案旨在作为对帕特里夏 沙纳汉已经给出的好答案的学究补充 这个答案涵盖了正常情况 在这里 我们担心的是您在实践中不太可能遇到的边缘情况 是的
  • “phpinfo():依赖系统的时区设置是不安全的......”[重复]

    这个问题在这里已经有答案了 在运行 Blue box FreeSwitch PBX 前端 的 php 安装脚本时 我收到有关时区故障的错误 然后我开始挖掘 我不确定此时发生了什么 但这是我所拥有的 我在 public html 目录中创建了
  • MS Access - 链接到另一个 Access 数据库中的查询

    如何链接来自另一个 MS Access 数据库的查询 我知道我可以轻松链接表格 但我不知道如何链接查询 该查询从许多我不想链接的表中获取数据 你可以这样做 SELECT RemoteQueryname FROM RemoteQuerynam
  • .NET WebClient.UploadValues 与 WebClient.UploadData

    我正在编写一个类库来在我控制之外的站点上执行操作 该网站正在接受表单帖子作为输入 谁能告诉我这两种方法除了上传数据的形式之外是否有区别 System Net WebClient UploadData Uri Byte System Net
  • scanf("%[^\n]s",a) 与 gets(a)

    有人告诉我 当用户输入字符串时不应使用 scanf 相反 大多数专家以及 StackOverflow 上的用户都使用 gets 我从来没有在 StackOverflow 上问过为什么不应该使用 scanf 而不是 gets 来处理字符串 这