【问题标题】:Writing to file if sprintf() buffer is overflow?如果 sprintf() 缓冲区溢出,写入文件?
【发布时间】:2026-01-31 01:40:01
【问题描述】:

假设我有这个简单的代码:

#include <stdio.h>
#define BUFFER_LEN 10
int main()
{
    char buffer[BUFFER_LEN];
    sprintf(buffer, "Oh noes, it's too long! What can I do?");

    return 0; 
}

显然它不起作用,因为缓冲区太小而无法包含字符串。我知道可以使用不同的功能,以及缓冲区的不同内存处理。 但是我的问题是:是否有可能以某种方式检查缓冲区是否溢出,如果是,则打开文本文件并写入它,而不是将其放入缓冲区中。

【问题讨论】:

  • 根据缓冲区大小检查您尝试写入的内容的长度?没有内置函数可以做你想做的事,所以你需要手动滚动它或找到一个库。
  • 这意味着我必须存储我想通过 sprintf 输入的输入并使用 BUFFER_LEN 检查它的长度,或者有没有办法访问 sprintf() 函数的第二个参数的长度,在这个案例将是“哦,不,太长了!我该怎么办”?

标签: c


【解决方案1】:

当然。先用snprintf()检查输出长度:

int len = snprintf(NULL, 0, "Oh noes, it's too long! What can I do?");

然后你有len,你可以进行必要的评估和比较。

来自CppReference

返回值

snprintf():如果 bufsz 被忽略,将写入缓冲区的字符数(不包括终止的空字符),或者如果发生编码错误(对于字符串和字符转换说明符),则为负值

所以它会将有限数量的字符写入缓冲区(由第二个参数指定),并返回将要写入的完整数据的长度,这使它成为一个很好的函数用于字符串长度评估。

【讨论】:

  • @wildplasser 同意。
  • 非常感谢,正是我想要的!
  • @wildplasser 我猜你的意思是strlen() 我故意避开了。