描述
sqlite3_snprintf功能类似于标准C库中的的snprintf.结果写入作为第二个参数提供的缓冲区,其大小由第一个参数给出。请注意,前两个参数的顺序与的snprintf相反。这是一个无法修复的历史事故,不会破坏向后兼容性。还要注意sqlite3_snprintf返回一个指向其缓冲区的指针,而不是实际写入缓冲区的字符数。我们承认写入的字符数将是一个更有用的返回值,但我们现在不能在不破坏兼容性的情况下更改sqlite3_snprintf的实现。
C / C ++语法
char *sqlite3_snprintf(int,char*,const char*, ...); |
PB语法
FUNCTION sqlite3_snprintf ( _ BYVAL bufLen AS LONG, _ BYREF szBuffer AS ASCIIZ, _ BYREF szFormat AS ASCIIZ, _ OPTIONAL BYREF ANY, BYREF ANY, BYREF ANY, BYREF ANY, _ BYREF ANY, BYREF ANY, BYREF ANY, BYREF ANY, BYREF ANY, _ BYREF ANY, BYREF ANY, BYREF ANY, BYREF ANY, BYREF ANY, _ BYREF ANY, BYREF ANY _ ) AS DWORD |
参数
bufLen
[in]输出缓冲区的总大小,包括零终止符的空间。
szBuffer
[in]输出缓冲区。只要缓冲区大小大于零,sqlite3_snprintf就保证缓冲区始终为零终止。可以完全写入的最长的字符串将是bufLen-1个字符。
szFormat
[in]szFormat字符串和后续参数与sqlite3_snprintf一起使用以生成最终的输出字符串。szFormat字符串不能为NULL。
返回值
指向生成的字符串。
备注
sqlite3_snprintf实现了一些对构建SQL语句有用的其他格式化选项。所有通常的的printf格式选项都适用。另外还有“%q”,“%Q”和“%z”选项。
%q选项的工作方式与%s一样,它代替参数列表中的一个以nul为终止的字符串。但是,%q也会将每个“\\”字符加倍。%q设计用于字符串文字内。通过将每个“\\”字符加倍,它转义该字符并允许将其插入到字符串中。
“%z”格式化选项的工作方式类似于“%s”,但是除了字符串读取和复制到结果之外,还会在输入字符串上调用sqlite3_free.
C ++实现代码
/*
** sqlite3_snprintf() works like snprintf() except that it ignores the
** current locale settings. This is important for SQLite because we
** are not able to use a "," as the decimal point in place of "." as
** specified by some locales.
**
** Oops: The first two arguments of sqlite3_snprintf() are backwards
** from the snprintf() standard. Unfortunately, it is too late to change
** this without breaking compatibility, so we just have to live with the
** mistake.
**
** sqlite3_vsnprintf() is the varargs version.
*/
SQLITE_API char *sqlite3_vsnprintf(int n, char *zBuf, const char *zFormat, va_list ap){
StrAccum acc;
if( n<=0 ) return zBuf;
sqlite3StrAccumInit(&acc, zBuf, n, 0);
acc.useMalloc = 0;
sqlite3VXPrintf(&acc, 0, zFormat, ap);
return sqlite3StrAccumFinish(&acc);
}
SQLITE_API char *sqlite3_snprintf(int n, char *zBuf, const char *zFormat, ...){
char *z;
va_list ap;
va_start(ap,zFormat);
z = sqlite3_vsnprintf(n, zBuf, zFormat, ap);
va_end(ap);
return z;
}
SQLITE_API char *sqlite3_vsnprintf(int n, char *zBuf, const char *zFormat, va_list ap){
StrAccum acc;
if( n<=0 ) return zBuf;
sqlite3StrAccumInit(&acc, zBuf, n, 0);
acc.useMalloc = 0;
sqlite3VXPrintf(&acc, 0, zFormat, ap);
return sqlite3StrAccumFinish(&acc);
}