当前位置: 首页 > news >正文

细说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)。
按任意键关闭此窗口. . .

相关文章:

  • python训练 60天挑战-day41
  • Day41 Python打卡训练营
  • 堆与堆排序及 Top-K 问题解析:从原理到实践
  • 《信号与系统》第 5 章 离散时间傅里叶变换
  • 德拜温度热容推导
  • 如何配置国内docker镜像源?
  • STM32F103通过Zigbee实现多分用户向主用户发送信息
  • 360浏览器设置主题
  • 法规解读——GB/T 前向碰撞预警功能FCW
  • 头歌java课程实验(Java面向对象 - 包装类)
  • 【python】uv管理器
  • 传统液晶瓶颈待破?铁电液晶如何实现显示技术逆袭
  • HomeKit 基本理解
  • 蓝桥杯java2021年十二届国赛大学A组真题答案整理
  • 如何手搓扫雷(待扩展)
  • [SC]SystemC在CPU/GPU验证中的应用(四)
  • JSR 303(即 Bean Validation)是一个通过​​注解在 Java Bean 上定义和执行验证规则​​的规范
  • C++ 的四种强制类型转换:static_cast、dynamic_cast、const_cast 和 reinterpret_cast
  • LXQt修改开始菜单高亮
  • NW969NW978美光闪存颗粒NW980NW984
  • 网站设计模板免费/seo高效优化
  • 哪些网站适合瀑布流/百度搜索引擎原理
  • 企业网站设置/百度搜索链接入口
  • 购物帮做特惠的网站/中国做网站的公司排名
  • 宣传网站设计/互联网营销师培训
  • c 做网站性能怎么样/百度竞价排名公式