arrays - 如何防止用户输入破坏堆栈?
问题描述
所以我正在编写一个程序,它接受用户输入并将其存储到一个长度为 10 的字符数组中,如下所示:
char str[10];
scanf("%s", str);
我想看看当我输入一个 11 个字符的字符串时会发生什么,我得到了这个:
*** stack smashing detected ***: terminated
Aborted (core dumped)
我的问题是这样的:
有没有办法通过以某种方式限制用户输入来防止用户输入超过 10 个字符?
有没有办法可以将任意数量的字符作为输入,然后将输入修剪到输入的前 10 个字符?
最后,这与前两个问题并不完全相关,我可以创建一个字符串,在用户提供输入时在字符数组中为字符串的大小分配足够的空间吗?我刚刚开始使用 C 语言,并且正在尽我所能来防止我的程序分配比它需要的更多的内存。我知道我可以说char str[255];
一天就结束了,但是当用户甚至不需要那么多字符时,这似乎很浪费。我想象一个程序询问用户他们的名字的场景,但我不能假设他们的名字多于或少于一定数量的字符。
解决方案
%s
格式说明符 to允许scanf
您指定字段宽度,即可以读取的最大字符数。您的缓冲区有 10 个元素宽,因此使用终止的空字节,您最多可以读取 9 个字符。然后,您可以按如下方式指定此大小:
scanf("%9s", str);
如果用户输入超过 9 个字符,它们将留在输入缓冲区中。
推荐阅读
- bash - 如何隐藏来自 dbus-send(打印回复)的响应?
- java - 在 Java Spring MVC 中记录错误
- matlab - 在matlab中通过反复试验求解方程
- python-3.x - 重复字母的计数,计数后跟字母
- android - 包含布局的逻辑
- mysql - MySql查询NodeJS的订单占位符
- python - 尝试构建卡路里计算器并收到“无效语法”错误
- arm - 为什么我的 ARM 控制器中的链接寄存器指向返回地址 + 1
- xcode - 为什么我添加 if 条件后我的应用程序会无缘无故崩溃?
- c# - 在 Xamarin 表单中呈现 HTML 并从 HTML 链接打开嵌入的 PDF