如何防止用户输入破坏堆栈?

How can I prevent user input from smashing the stack?

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

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

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

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

我的问题是:

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

有没有一种方法可以将任意数量的字符作为输入,然后 trim 输入到前 10 个字符?

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

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

scanf("%9s", str);

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

对于您的第一个问题,您可以使用 for 或 while 循环轻松地限制输入的数量。就像下面的代码:

#include <stdio.h>

int main() 
{ 
    int index; 
    char string[7]; 
    printf("Enter a string : "); 
    for(index = 0 ;index<6;index++){ 
        scanf("%c",&string[index]); 
    } 
    string[index]='[=10=]'; //null terminated 
    puts(string); // string function in c to display a string 
    return 0; 
}

这也会 trim 减少您的输入数量。但是在其他回答中提到:scanf("%9s", str);,我觉得好多了,我也是第一次知道这个。

对于你的最后一个问题,你必须使用动态内存分配。