在Windows中使用printf 有文字模式、命令列C语言程式写作历史的程式写作者往往特别喜欢printf函式。即使可以使用更简单的命令(例如puts),但printf出现在Kernighan和Ritchie的「hello, world」程式中一点也不会令人惊奇。我们知道,增强後的「hello, world」最终还是需要printf的格式化输出,因此我们最好从头开始就使用它。 但有个坏消息:在Windows程式中不能使用printf。虽然Windows程式中可以使用大多数C的执行时期程式库-实际上,许多程式写作者更愿意使用C记忆体管理和档案I/O函式而不是Windows中等效的函式-Windows对标准输入和标准输出没有概念。在Windows程式中可使用fprintf,而不是printf。 还有一个好消息,那就是仍然可以使用sprintf及sprintf系列中的其他函式来显示文字。这些函式除了将内容格式化输出到函式第一个参数所提供的字串缓冲区以外,其功能与printfI相同。然後便可对该字串进行操作(例如将其传给MessageBox)。 如果您从未使用过sprintf (我第一次开始写Windows程式时也没用过此函式),这里有一个简短的执行实体,printf函式说明如下: int printf (const char * szFormat, ...) ; sprintf函式定义如下: int sprintf (char * szBuffer, const char * szFormat, ...) ; printf ("The sum of %i and %i is %i", 5, 3, 5+3) ; char szBuffer [100] ; 几乎每个人都经历过,当格式字串与被格式化的变数不合时,可能使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, ...) 由於许多Windows早期程式使用了sprintf和vsprintf,最终导致Microsoft向Windows API中增添了两个相似的函式。Windows的wsprintf和wvsprintf函式在功能上与sprintf和vsprintf相同,但它们不能处理浮点格式。 当然,随著宽字元的发表,sprintf类型的函式增加许多,使得函式名称变得极为混乱。表2-1列出了Microsoft的C执行时期程式库和Windows支援的所有sprintf函式。 表2-1 ASCII 宽字元 常规 在宽字元版的sprintf函式中,将字串缓冲区定义为宽字串。在宽字元版的所有这些函式中,格式字串必须是宽字串。不过,您必须确保传递给这些函式的其他字串也必须由宽字元组成。 |
相关文章
- printf()和scanf()函数的使用
- 深入浅析php中sprintf与printf函数的用法及区别
- PHP中怎么用echo、print、print_r、var_dump、printf、sprintf 和 vsprintf ?
- php中print、printf、sprintf的区别?
- C语言printf()、sprintf()、vsprintf() 的区别与联系
- C语言中的输入输出函数详解与比较scanf,sscanf,printf,sprintf,fprintf
- php: 输出echo、print、print_r、printf、sprintf、var_dump、die的区别比较
- Perl的输出:print、say和printf、sprintf
- PHP输出函数print, printf, sprintf的区别
- C语言printf()、sprintf()、vsprintf() 的区别与联系