WPRINTF - Linux手册页

时间:2019-08-20 18:01:29  来源:igfitidea点击:

Linux程序员手册 第3部分
更新日期: 2019-03-06

名称

wprintf,fwprintf,swprintf,vwprintf,vfwprintf,vswprintf-格式化的宽字符输出转换

语法

#include <stdio.h>
#include <wchar.h>

int wprintf(const wchar_t *format, ...);
int fwprintf(FILE *stream, const wchar_t *format, ...);
int swprintf(wchar_t *wcs, size_t maxlen,
             const wchar_t *format, ...);

int vwprintf(const wchar_t *format, va_list args);
int vfwprintf(FILE *stream, const wchar_t *format, va_list args);
int vswprintf(wchar_t *wcs, size_t maxlen,
              const wchar_t *format, va_list args);

glibc的功能测试宏要求(请参阅feature_test_macros(7)):

上面显示的所有功能:

_XOPEN_SOURCE>= 500 || _ISOC99_SOURCE || _POSIX_C_SOURCE>= 200112L

说明

wprintf()函数族与printf(3)函数族的宽字符等效。它执行宽字符的格式化输出。

wprintf()和vwprintf()函数执行宽字符输出到stdout。 stdout不能面向字节;有关更多信息,请参见fwide(3)。

fwprintf()和vfwprintf()函数执行宽字符输出以流式传输。流不能面向字节;有关更多信息,请参见fwide(3)。

swprintf()和vswprintf()函数将宽字符输出执行到宽字符数组。程序员必须确保在wcs处至少有最大maxlen宽字符的空间。

这些功能类似于printf(3),vprintf(3),fprintf(3),vfprintf(3),sprintf(3),vsprintf(3)功能,但以下区别不同:

*
格式字符串是一个宽字符字符串。
*
输出包含宽字符,而不是字节。
*
swprintf()和vswprintf()带有maxlen参数,而sprintf(3)和vsprintf(3)则没有。 (snprintf(3)和vsnprintf(3)带有maxlen参数,但是在Linux上的缓冲区溢出时,这些函数不会返回-1。)

转换字符c和s的处理方式不同:

c
如果不存在l修饰符,则通过调用btowc(3)函数将int参数转换为宽字符,并写入生成的宽字符。如果存在l修饰符,则写入wint_t(宽字符)参数。
s
如果不存在l修饰符:则const char *参数应为指向字符类型数组的指针(指向字符串的指针),该数组包含从初始移位状态开始的多字节字符序列。数组中的字符将转换为宽字符(通过调用mbrtowc(3)函数,每个函数的转换状态从第一个字节之前的初始状态开始)。生成的宽字符将写入(但不包括)终止空宽字符(Laq \ 0aq)。如果指定了精度,则写入的宽字符数不超过指定的数字。请注意,精度决定写入的宽字符数,而不是字节数或屏幕位置数。数组必须包含一个终止的空字节(aq \ 0aq),除非给出了精度,并且该精度太小以至于在到达数组末尾之前已转换的宽字符数达到了该精度。如果存在l修饰符:则const wchar_t *参数应为指向宽字符数组的指针。数组中的宽字符将写入(但不包括)终止的空宽字符。如果指定了精度,则最多写入指定的数字。数组必须包含一个终止的空宽字符,除非给出了精度并且它小于或等于数组中的宽字符数。

返回值

该函数返回写入的宽字符数,如果使用swprintf()和vswprintf(),则不包括终止的空宽字符。发生错误时,它们返回-1。

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
wprintf(),fwprintf(),
swprintf(),vwprintf(),
vfwprintf(),vswprintf()
Thread safetyMT-Safe locale

遵循规范

POSIX.1-2001,POSIX.1-2008,C99。

备注

wprintf()等的行为。取决于当前语言环境的LC_CTYPE类别。

如果格式字符串包含非ASCII宽字符,则仅当运行时当前语言环境的LC_CTYPE类别与编译时当前语言环境的LC_CTYPE类别相同时,程序才能正常运行。这是因为wchar_t表示依赖于平台和语言环境。 (glibc使用其Unicode(ISO-10646)代码点表示宽字符,但其他平台则不这样做。而且,使用\ unnnn形式的C99通用字符名称不能解决此问题。)因此,在在国际化程序中,格式字符串应仅由ASCII宽字符组成,或者应在运行时以国际化方式构造(例如,使用gettext(3)或iconv(3),然后使用mbstowcs(3))。

另外参见

fprintf(3),fputwc(3),fwide(3),printf(3),snprintf(3)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/