c - Scanf 读取超过预定义字符数组大小的字符串
问题描述
我正在尝试通过scanf
如下方式读取字符串:
char input[8];
scanf("%s",input);
事实证明,该程序可以读取超过 8 个字符。假设我输入了 123456789012345,strlen(input) 返回 15。
但是,当我将输入设置为:
char input[4];
scanf("%s",input);
输入“12345”将导致“16146 分段错误”。有谁知道这是怎么回事?
解决方案
从技术上讲,这两种情况都会调用未定义的行为。第一种情况恰好在您的系统上工作不应该被认为意味着您的程序是定义良好的。测试只能表明错误的存在,而不是它们的缺失。
由于您仍在学习 CI,因此 CI 将借此机会为您提供有关从以下位置读取输入的建议stdin
:始终将要读取的输入长度限制为正在读取的缓冲区的长度,在末尾保留一个位置空终止符。
如果您想使用scanf
从 读取字符串stdin
,那么在字符串格式说明符前面加上字符串的最大长度比使用 raw 更安全"%s"
。例如,如果我有一个char buffer[20];
作为调用目标的scanf
,我将使用格式字符串"%19s"
。
推荐阅读
- amazon-web-services - 如何将 AWS 流量从容器 A 镜像到容器 B
- javascript - 是否可以在实际获取之前检查 onSnapshot() 是否发现了更改?
- python - Python 模块混淆
- c# - ASP.NET Core NullReferenceException 表单发布后
- documentation - 如何使用 aws cdk 记录 rest api
- sql-server - SQL Server 登录被锁定,但并未真正被锁定
- javascript - 如何确定 HTML 元素的大小?(添加元素的补间大小)
- node.js - 在 node.js 中使用 _id 从 MongoDB 获取对象
- php - i18nFormat 中缺少时区
- r - 在列名的循环内创建公式