首页 > 解决方案 > 如何防止用户输入破坏堆栈?

问题描述

所以我正在编写一个程序,它接受用户输入并将其存储到一个长度为 10 的字符数组中,如下所示:

char str[10];
scanf("%s", str);

我想看看当我输入一个 11 个字符的字符串时会发生什么,我得到了这个:

*** stack smashing detected ***: terminated
Aborted (core dumped)

我的问题是这样的:

有没有办法通过以某种方式限制用户输入来防止用户输入超过 10 个字符?

有没有办法可以将任意数量的字符作为输入,然后将输入修剪到输入的前 10 个字符?

最后,这与前两个问题并不完全相关,我可以创建一个字符串,在用户提供输入时在字符数组中为字符串的大小分配足够的空间吗?我刚刚开始使用 C 语言,并且正在尽我所能来防止我的程序分配比它需要的更多的内存。我知道我可以说char str[255];一天就结束了,但是当用户甚至不需要那么多字符时,这似乎很浪费。我想象一个程序询问用户他们的名字的场景,但我不能假设他们的名字多于或少于一定数量的字符。

标签: arrayscstringmemory

解决方案


%s格式说明符 to允许scanf您指定字段宽度,即可以读取的最大字符数。您的缓冲区有 10 个元素宽,因此使用终止的空字节,您最多可以读取 9 个字符。然后,您可以按如下方式指定此大小:

scanf("%9s", str);

如果用户输入超过 9 个字符,它们将留在输入缓冲区中。


推荐阅读