勇芳软件工作室.汉化:  SQLite3 API Functions > General >

sqlite3_snprintf

Previous pageReturn to chapter overviewNext page

描述

 

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);

}