在最近工作中,在拼接sql语句时,用到格式化字符串,经过和同事讨论后,有了新的思考。这个点在之前都是参照已有来使用,没有深入去追究,本次全面了解下。
格式化字符串
在实际工程中,格式化字符串一般用在打印日志、拼接字符串等,目前在工程中常见的是这样用的:
char szbuf[128] = {0};
snprintf(szbuf, sizeof(szbuf) - 1, "log:%d %s", 1,"XXXX");
按照上述格式化完后,对缓冲区szBuf
进行各种操作。这里面有几点疑问:
- 这里没有判断
snprintf
的返回值,需不需要判断? snprintf
的第二个参数为什么要减1?- 没有考虑格式化完整性
下面依次分析。
snprintf的返回值代表什么含义
在linux
环境上,snprintf
的函数原型如下。
int snprintf(char* str, size_t size, const char* format, ...);
查阅snprintf
的man
手册,对返回值有如下说明:
该函数的返回值表示待格式化字符串的长度,不包括结束分隔符。这是什么意思呢?举个例子:
- 格式化
abcd
字符串,返回值是4,表示待格式化的字符个数为4。 - 格式化
01234567890
字符串,返回值为10。
这个返回值和传入的缓冲区长度size
没有任何关系的,它只与待格式化字符串的长度有关。
另一个需要注意的点是,这个函数在格式化时,不会往缓冲区str中写入多于size
大小的数据,包括