gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:15:51 26 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/1621394/

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