如果sprintf()缓冲区溢出,写入文件?

时间:2018-01-24 12:31:59

标签: c

让我说我有这个简单的代码:

#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; 
}

显然,由于缓冲区太小而无法包含字符串,因此无法正常工作。我知道可以使用不同的函数,缓冲区的内存处理也不同。 但是我的问题是:是否有可能以某种方式检查缓冲区是否溢出,如果是这样,打开文本文件并写入,而不是将其放在缓冲区内。

1 个答案:

答案 0 :(得分:5)

不确定。首先使用snprintf()检查输出长度:

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

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

来自CppReference

  

返回值

     

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

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