细说C语言将格式化输出打印至标准输出流的函数 printf、_printf_l、wprintf、_wprintf_l
目录
一、 格式化输出打印至stdout的函数
1、打印至标准输出流
(1)语法
(2)参数
(3)示例
(4)运行结果
2、并启用在格式字符串中使用参数的顺序
(1)语法
(2) 参数
(3)示例
(4)运行结果
3、打印至标准输出流的安全版本
(1)语法
(2)参数
(3)示例
(4)运行结果
一、 格式化输出打印至stdout的函数
以printf()为根的将格式化输出打印至标准输出流的函数有:
1、打印至标准输出流
将格式化输出打印至标准输出流printf、_printf_l、wprintf、_wprintf_l。
(1)语法
/**
printf 函数格式化一系列字符和值并将其输出到标准输出流 stdout。 如果自变量跟在 format 字符串后面,则 format 字符串必须包含确定自变量的输出格式的规范。 printf 和 fprintf 的行为相同,只不过 printf 会将输出写入到 stdout 而不是 FILE 类型的目标。
wprintf 是 printf 的宽字符版本;format 是宽字符字符串。 如果在 ANSI 模式下打开流,则 wprintf 和 printf 的行为相同。 printf 当前不支持到 UNICODE 流中的输出。
这些带有 _l 后缀的函数的版本相同,只不过它们使用传递的区域设置参数而不是当前线程区域设置。
format 自变量由普通字符、转义序列和(如果自变量遵循 format)格式规范组成。 将普通字符和转义序列按照其外观的顺序复制到 stdout。
*/int printf(const char *format [,argument]...
);
int _printf_l(const char *format,_locale_t locale [,argument]...
);
int wprintf(const wchar_t *format [,argument]...
);
int _wprintf_l(const wchar_t *format,_locale_t locale [,argument]...
);
(2)参数
format:
设置控件格式。argument:
可选参数。locale:
要使用的区域设置。-
返回值:返回输出的字符数或负值(如果出错)。 如果
format
为NULL
,则会调用无效的参数处理程序,如参数验证中所述。 如果允许执行继续,则该函数将返回 -1 并将errno
设置为EINVAL
。 如果在argument
中遇到EOF
(0xFFFF),则该函数将返回 -1。
(3)示例
// printf.c
// This program uses the printf and wprintf functions
// to produce formatted output.#include <stdio.h>int main(void)
{char ch = 'h',* string = "computer";wchar_t wch = L'w',* wstring = L"Unicode";int count = -9234;double fp = 251.7366;// Display integersprintf("Integer formats:\n"" Decimal: %d Justified: %.6d ""Unsigned: %u\n",count, count, count);// Display decimalsprintf("Decimal %d as:\n Hex: %Xh ""C hex: 0x%x Octal: %o\n",count, count, count, count);// Display in different radixesprintf("Digits 10 equal:\n Hex: %i ""Octal: %i Decimal: %i\n",0x10, 010, 10);// Display charactersprintf("Characters in field (1):\n""%10c%5hc%5C%5lc\n",ch, ch, wch, wch);wprintf(L"Characters in field (2):\n"L"%10C%5hc%5c%5lc\n",ch, ch, wch, wch);// Display stringsprintf("Strings in field (1):\n%25s\n""%25.4hs\n %S%25.3ls\n",string, string, wstring, wstring);wprintf(L"Strings in field (2):\n%25S\n"L"%25.4hs\n %s%25.3ls\n",string, string, wstring, wstring);// Display real numbersprintf("Real numbers:\n %f %.2f %e %E\n",fp, fp, fp, fp);// Display pointerprintf("\nAddress as: %p\n", &count);
}
(4)运行结果
Integer formats:Decimal: -9234 Justified: -009234 Unsigned: 4294958062
Decimal -9234 as:Hex: FFFFDBEEh C hex: 0xffffdbee Octal: 37777755756
Digits 10 equal:Hex: 16 Octal: 8 Decimal: 10
Characters in field (1):h h w w
Characters in field (2):h h w w
Strings in field (1):computercompUnicode Uni
Strings in field (2):computercompUnicode Uni
Real numbers:251.736600 251.74 2.517366e+02 2.517366E+02Address as: 00000034547FF804C:\Users\pc\printf\TestPrintf\x64\Debug\TestPrintf.exe (进程 16672)已退出,代码为 0 (0x0)。
按任意键关闭此窗口. . .
2、并启用在格式字符串中使用参数的顺序
将格式化的输出打印到标准输出流,并启用在格式字符串中使用参数的顺序的规范:
_printf_p、_printf_p_l、_wprintf_p、_wprintf_p_l。
(1)语法
/**
_printf_p 函数格式化一系列字符和值并将其输出到标准输出流 stdout。 如果自变量跟在 format 字符串后面,则 format 字符串必须包含确定自变量的输出格式的规范。
_printf_p 和 printf_s 之间的差异在于 _printf_p 支持位置参数,这允许指定格式字符串中使用参数的顺序。
_wprintf_p 是 _printf_p 的宽字符版本;如果在 ANSI 模式下打开流,则它们的行为相同。 _printf_p 当前不支持到 UNICODE 流中的输出。
这些带有 _l 后缀的函数的版本相同,只不过它们使用传递的区域设置参数而不是当前线程区域设置。
确保 format 不是用户定义的字符串。
如果 format 或 argument 是 NULL,或者格式字符串包含无效的格式字符,则 _printf_p 和 _wprintf_p 函数将调用无效参数处理程序,如参数验证中所述。 如果允许执行继续,则该函数将返回 -1 并将 errno 设置为 EINVAL。
*/int _printf_p(const char *format [,argument]...
);
int _printf_p_l(const char *format,_locale_t locale [,argument]...
);
int _wprintf_p(const wchar_t *format [,argument]...
);
int _wprintf_p_l(const wchar_t *format,_locale_t locale [,argument]...
);
(2) 参数
- format:设置控件格式。
- argument:可选参数。
- locale:要使用的区域设置。
- 返回值:返回输出的字符数或负值(如果出错)。
(3)示例
// printf_p.c
// This program uses the _printf_p and _wprintf_p
// functions to choose the order in which parameters
// are used.#include <stdio.h>int main(void)
{// Positional arguments_printf_p("Specifying the order: %2$s %3$s %1$s %4$s %5$s.\n","little", "I'm", "a", "tea", "pot");// Resume arguments_wprintf_p(L"Reusing arguments: %1$d %1$d %1$d %1$d\n", 10);// Width argument_printf_p("Width specifiers: %1$*2$s", "Hello\n", 10);
}
(4)运行结果
Specifying the order: I'm a little tea pot.
Reusing arguments: 10 10 10 10
Width specifiers: HelloC:\Users\pc\printf\Test_Printf_p\x64\Debug\Test_Printf_p.exe (进程 11280)已退出,代码为 0 (0x0)。
按任意键关闭此窗口. . .
3、打印至标准输出流的安全版本
将格式化输出打印至标准输出流,这些版本的 printf、_printf_l、wprintf、_wprintf_l 具有的安全增强功能:
printf_s、_printf_s_l、wprintf_s、_wprintf_s_l。
(1)语法
/**
printf_s 函数格式化一系列字符和值并将其输出到标准输出流 stdout。 如果自变量跟在 format 字符串后面,则 format 字符串必须包含确定自变量的输出格式的规范。
printf_s 和 printf 的一个主要区别在于,printf_s 检查格式字符串中的格式字符是否有效,而 printf 仅检查格式字符串是否为 null 指针。 如果任一检查失败,将调用无效参数处理程序,如参数验证中所述。 如果允许执行继续,则该函数将返回 -1 并将 errno 设置为 EINVAL。
printf_s 和 fprintf_s 的行为相同,只不过 printf_s 会将输出写入到 stdout 而不是 FILE 类型的目标。
wprintf_s 是 printf_s 的宽字符版本;format 是宽字符字符串。 如果在 ANSI 模式下打开流,则 wprintf_s 和 printf_s 的行为相同。 printf_s 当前不支持到 UNICODE 流中的输出。
这些带有 _l 后缀的函数的版本相同,只不过它们使用传递的区域设置参数而不是当前线程区域设置。*/int printf_s(const char *format [,argument]...
);
int _printf_s_l(const char *format,_locale_t locale [,argument]...
);
int wprintf_s(const wchar_t *format [,argument]...
);
int _wprintf_s_l(const wchar_t *format,_locale_t locale [,argument]...
);
(2)参数
format:
设置控件格式。argument:
可选参数。locale:
要使用的区域设置。-
返回值:返回输出的字符数或负值(如果出错)。
format
自变量由普通字符、转义序列和(如果自变量遵循 format
)格式规范组成。 将普通字符和转义序列按照其外观的顺序复制到 stdout
。
(3)示例
// printf_s.c
/* This program uses the printf_s and wprintf_s functions
* to produce formatted output.
*/#include <stdio.h>int main(void)
{char ch = 'h';const char* string = "computer";int count = -9234;double fp = 251.7366;wchar_t wch = L'w'; //宽字节就是用2个字节来表示一个汉字或字符const wchar_t * wstring = L"Unicode"; //加L在前面就令它成为宽字节常量/* Display integers. */printf_s("Integer formats:\n"" Decimal: %d Justified: %.6d Unsigned: %u\n",count, count, count);printf_s("Decimal %d as:\n Hex: %Xh C hex: 0x%x Octal: %o\n",count, count, count, count);/* Display in different radixes. *//* %d专用于表示有符号的十进制整数,而%i则能智能识别输入的基数,支持十进制、八进制及十六进制。*//* 用十进制数表达其它进制得的数值 */printf_s("Digits 10 equal:\n Hex: %i Octal: %i Decimal: %i\n",0x10, 010, 10);/* Display characters. *//* h短整数或单精度浮点数l 长整数或双精度浮点数 */printf_s("Characters in field (1):\n%10c%5hc%5C%5lc\n", ch, ch, wch, wch);wprintf_s(L"Characters in field (2):\n%10C%5hc%5c%5lc\n", ch, ch, wch, wch);/* Display strings. *//* h短整数或单精度浮点数l 长整数或双精度浮点数 %25.4hs,宽字符,占位25,只输出4个字符,不足的位用空格左补齐%25.3ls,宽字符,占位25,只输出3个字符,不足的位用空格左补齐 */printf_s("Strings in field (1):\n%25s\n%25.4hs\n %S%25.3ls\n",string, string, wstring, wstring);printf_s("Strings in field (1):\n%25s\n%25.8hs\n %S%25.7ls\n",string, string, wstring, wstring);wprintf_s(L"Strings in field (2):\n%25S\n%25.4hs\n %s%25.3ls\n",string, string, wstring, wstring);/* Display real numbers. */printf_s("Real numbers:\n %f %.2f %e %E\n", fp, fp, fp, fp);/* Display pointer. */printf_s("\nAddress as: %p\n", &count);}
(4)运行结果
Integer formats:Decimal: -9234 Justified: -009234 Unsigned: 4294958062
Decimal -9234 as:Hex: FFFFDBEEh C hex: 0xffffdbee Octal: 37777755756
Digits 10 equal:Hex: 16 Octal: 8 Decimal: 10
Characters in field (1):h h w w
Characters in field (2):h h w w
Strings in field (1):computercompUnicode Uni
Strings in field (1):computercomputerUnicode Unicode
Strings in field (2):computercompUnicode Uni
Real numbers:251.736600 251.74 2.517366e+02 2.517366E+02Address as: 0000003FB2F7FAE4C:\Users\pc\printf\Test_Printf_s\x64\Debug\Test_Printf_s.exe (进程 24328)已退出,代码为 0 (0x0)。
按任意键关闭此窗口. . .