sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,
后者则直接在命令行上输出。
sprintf函数定义如下:
int sprintf (char * szBuffer, const char * szFormat, ...) ;
第一个参数是字符缓冲区;后面是一个格式字符串。Sprintf不是将格式化结果标准输出,而是将其存入szBuffer。
该函数返回该字符串的长度。在文字模式程序设计中,
printf ("The sum of %i and %i is %i", 5, 3, 5+3) ;
的功能相同于
char szBuffer [100] ; sprintf (szBuffer, "The sum of %i and %i is %i", 5, 3, 5+3) ; puts (szBuffer) ;
几乎每个人都经历过,当格式字符串与被格式化的变量不合时,可能使printf执行错误并可能造成程序当掉。使用sprintf时,您不但要担心这些,而且还有一个新的负担:您定义的字符串缓冲区必须足够大以存放结果。Microsoft专用函数_snprintf解决了这一问题,此函数引进了另一个参数,表示以字符计算的缓冲区大小。
vsprintf是sprintf的一个变形,它只有三个参数。vsprintf用于执行有多个参数的自订函数,类似printf格式。vsprintf的前两个参数与sprintf相同:一个用于保存结果的字符缓冲区和一个格式字符串。第三个参数是指向格式化参数数组的指针。实际上,该指针指向在堆栈中供函数呼叫的变量。va_list、va_start和va_end宏(在STDARG.H中定义)帮助我们处理堆栈指针。本章最后的SCRNSIZE程序展示了使用这些宏的方法。使用vsprintf函数,sprintf函数可以这样编写:
int sprintf (char * szBuffer, const char * szFormat, ...) { int iReturn ; va_list pArgs ; va_start (pArgs, szFormat) ; iReturn = vsprintf (szBuffer, szFormat, pArgs) ; va_end (pArgs) ; return iReturn ; }
va_start宏将pArg设置为指向一个堆栈变量,该变量地址在堆栈参数szFormat的上面。
由于许多Windows早期程序使用了sprintf和vsprintf,最终导致Microsoft向Windows API中增添了两个相似的函数。Windows的wsprintf和wvsprintf函数在功能上与sprintf和vsprintf相同,但它们不能处理浮点格式。
当然,随着宽字符的发表,sprintf类型的函数增加许多,使得函数名称变得极为混乱。
表2-1列出了Microsoft的C执行时期链接库和Windows支持的所有sprintf函数。
ASCII | 宽字符 | 常规 | |
参数的变数个数 | |||
标准版 | sprintf | swprintf | _stprintf |
最大长度版 | _snprintf | _snwprintf | _sntprintf |
Windows版 | wsprintfA | wsprintfW | wsprintf |
参数数组的指针 | |||
标准版 | vsprintf | vswprintf | _vstprintf |
最大长度版 | _vsnprintf | _vsnwprintf | _vsntprintf |
Windows版 | wvsprintfA | wvsprintfW | wvsprintf |