snprintf的返回值的问题


今天写了段代码,为了防止越界,使用了snprintf,debug的时候发现有些问题,发现返回值并不是写入数据的长度,而是需要复制的原内容的长度,大跌眼镜,怪不得微软后面还推荐了snprintf_s这个函数,之前一直不知道所以然,现在才发现还是有根据的,如果在代码中使用了这个函数,真的要注意这个函数的返回值。

snprintf的函数原型为:
int snprintf(char *str, size_t size, const char *format, …);

说明:
之前以为snprintf的返回值是实际写入到str字符串的长度,实际上不是,要分两种情况。

1) 如果要输出的字符串的长度< size, 因为snprintf会自动将\0追加入到str中,snprintf的返回值是实际写入缓冲区的长度。

2) 如果要输出的字符串长度>= size, 则表明缓冲区的长度不够写入原有的长度,则snprintf的返回值为理想中要复制的字符串长度,所以其返回值可能会出现>= size的情况。但是事实上写入缓冲区的内容为原定的缓冲区的大小-1,同时后面追加‘\0’。不会出现越界的问题,只是这个时候需要注意返回值,不是缓冲区写入的大小。

 

int testSnprintf()
{
char *sSrc = "0123456789";
int iSzLen = 0;
char buff[32] = { 0 };
int nRet = 32;

//此段程序在buff后面循环加上数据,sSrc长度固定,返回值一直都是sSrc的长度10,
//当可用buff足够的时候,循环第0-2时,字符串长度(strlen)每次增长的长度都是10;
//但是当可用buff不足的时候,只能输入限定的字节长度,字符串后续不再增长。
for (int i = 0;i < 5;i++)
{
iSzLen = snprintf(buff+strlen(buff), 32-strlen(buff), "%s", sSrc);
printf("000%d---iSzLen=%d,strlen(buff)=%d,%s\r\n", i, iSzLen, strlen(buff), buff);
}
return 0;
}

 

返回结果

0000---iSzLen=10,strlen(buff)=10,0123456789
0001---iSzLen=10,strlen(buff)=20,01234567890123456789
0002---iSzLen=10,strlen(buff)=30,012345678901234567890123456789
0003---iSzLen=10,strlen(buff)=31,0123456789012345678901234567890
0004---iSzLen=10,strlen(buff)=31,0123456789012345678901234567890

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM