gpt4 book ai didi

c - 如何防止scanf导致C语言缓冲区溢出?

转载 作者:行者123 更新时间:2023-11-30 16:16:37 25 4
gpt4 key购买 nike

我使用这个代码:

while ( scanf("%s", buf) == 1 ){

防止可能的缓冲区溢出以便可以传递随机长度的字符串的最佳方法是什么?

我知道我可以通过调用来限制输入字符串,例如:

while ( scanf("%20s", buf) == 1 ){

但我希望能够处理用户输入的任何内容。或者不能使用 scanf 安全地完成此操作,而我应该使用 fgets?

最佳答案

在他们的书中The Practice of Programming (非常值得一读),Kernighan 和 Pike 讨论了这个问题,他们通过使用 snprintf() 创建具有正确缓冲区大小的字符串以传递给 scanf() 来解决该问题 函数族。生效:

int scanner(const char *data, char *buffer, size_t buflen)
{
char format[32];
if (buflen == 0)
return 0;
snprintf(format, sizeof(format), "%%%ds", (int)(buflen-1));
return sscanf(data, format, buffer);
}

请注意,这仍然将输入限制为“缓冲区”提供的大小。如果您需要更多空间,那么您必须进行内存分配,或者使用非标准库函数来为您进行内存分配。

<小时/>

请注意,scanf() 的 POSIX 2008 (2013) 版本函数系列支持字符串输入的格式修饰符 m(赋值分配字符)(%s%c% [)。它不采用 char * 参数,而是采用 char ** 参数,并为其读取的值分配必要的空间:

char *buffer = 0;
if (sscanf(data, "%ms", &buffer) == 1)
{
printf("String is: <<%s>>\n", buffer);
free(buffer);
}

如果 sscanf() 函数无法满足所有转换规范,则在函数返回之前,它为类似 %ms 的转换分配的所有内存都会被释放。

关于c - 如何防止scanf导致C语言缓冲区溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56525626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com