标签:gcc 有符号数 应用 bsp 一点 pre 结束 包括 std
#include <stdio.h>
int printf(const char *format, ...);
int
fprintf(FILE *stream, const char *format, ...);
int sprintf(char *str, const char *format,
...);
int snprintf(char *str, size_t
size, const char *format, ...);
#include <stdarg.h>
int vprintf(const char *format, va_list
ap);
int vfprintf(FILE *stream, const
char *format, va_list ap);
int
vsprintf(char *str, const char *format, va_list
ap);
int vsnprintf(char *str, size_t
size, const char *format, va_list
ap);
printf 系列 函数 根据 下述的 format 参数 生成 输出内容. printf 和 vprintf 函数 把 输出内容 写到 stdout, 即 标准输出流; fprintf 和 vfprintf 函数 把 输出内容 写到 给定的 stream 流; sprintf, snprintf, vsprintf 和 vsnprintf 函数 把 输出内容 存放到 字符串 str 中.
这些 函数 由 格式字符串 format 参数 控制 输出内容, 它 指出 怎么样 把 后面的 参数 (或 通过 stdarg(3) 的 变长参数机制 访问的 参数) 转换成 输出内容.
这些 函数 返回 打印的 字符 数量 (不包括 字符串 结尾用的 `\0‘). snprintf 和 vsnprintf 的 输出 不会 超过 size 字节 (包括了 结尾的 `\0‘), 如果 因为 这个 限制 导致 输出内容 被截断, 则 函数 返回 -1.
格式字符串 (format 参数) 由 零到多个 指令 组成: 普通字符 (除 % 外), 它们 被 原封不动的 送到 输出流; 以及 格式转换说明 (conversion specification), 每个 格式转换说明 都会 从后面 提取 零到多个 参数. 格式转换说明 由 % 字符 引导开始. 参数 必须 正确的 对应到 格式转换符 (conversion specifier) 上. 下述 字符 按顺序 列在 % 后面:
可以 用 星号 `*‘ 代替 数字 指定 域宽 或 精度, 也可以 两者 同时 指定. 这种情况下 要求 用一个 int 参数 指出 域宽 或 精度. 负域宽 被认为是 正域宽 跟在 向左对齐标志 后面; 负精度 被认为是 精度 丢失.
格式转换符(specifier) 及其 含义 如下:
不指定 域宽 或 偏小的 域宽 不会 导致 内容 被截断; 如果 转换结果 的 长度超过 其域宽, 则 域宽 会 扩大到 容下 完整的 结果.
以 `Sunday, July 3, 10:02‘ 格式 显示 日期, 其中 weekday
和 month 是 字符串指针:
#include <stdio.h> fprintf(stdout, "%s, %s %d, %.2d:%.2d\n", weekday, month, day, hour, min);
显示 五位 十进制数:
#include <math.h> #include <stdio.h> fprintf(stdout, "pi = %.5f\n", 4 * atan(1.0));
分配 128 个 字节 的 字符串 空间 保存 打印 结果:
#include <stdio.h> #include <stdlib.h> #include <stdarg.h> char *newfmt(const char *fmt, ...) { char *p; va_list ap; if ((p = malloc(128)) == NULL) return (NULL); va_start(ap, fmt); (void) vsnprintf(p, 128, fmt, ap); va_end(ap); return (p); }
printf(1), scanf(3)
fprintf, printf, sprintf, vprintf, vfprintf, 和 vsprintf 函数 遵循 ANSI C3.159-1989 (``ANSI C‘‘) 标准.
q 是 BSD 4.4 对 long long 形 的 标志, 而 整数格式转换 的 ll 或 L 是 GNU 的 标志.
这些 函数 的 Linux 版本 基于 GNU libio 库. 有关细节 可以 查看 GNU libc (glibc-1.08) 的 info 文档.
在 Linux 下 某些 浮点格式转换 会导致 内存泄露.
这些函数 都遵循 完整的 ANSI C3.159-1989, 但是 提供了 附加的 q, Z 和 ‘ 标志, 并给了 L 和 l 标志 更多的 特性. 后者 可能会 被认为 是 bug, 因为 它 改变了 ANSI C3.159-1989 中 定义的 特性.
用 零 填充 的 %p 格式转换 (既可以用 0 标志, 也可以用 精度), 对 %n 和 %p 格式转换 使用 # (即不处理), 以及 某些 不标准的 荒谬 组合; 这些 组合 应当 避免.
某些 ANSI C 定义 的 标志 组合 没有 意义 (如 %Ld). 即使 在 Linux 机器上 定义的 比较好, 但是 其他 体系结构 不一定 有相同的 结果. 因此 最好 别用 While they may have a well-defined behaviour on Linux, this need not to be so on other architectures. Therefore it usually is better not to use flags that are not defined by ANSI C at all, i.e. use q instead of L in combination with diouxX conversions or ll.
q 的 用法 和 BSD 4.4 上 不一样, 它 可能 用在 浮点格式转换 上, 即等于 L.
因为 sprintf 和 vsprintf 不设定 字符串的 长度, 调用者 必须小心 别让它 从 有效空间 溢出; 这一点通常 不能 保证.
printf, fprintf, sprintf, snprintf, vprintf, vfprintf, vsprintf, vsnprintf - 输出格式转换
标签:gcc 有符号数 应用 bsp 一点 pre 结束 包括 std
原文地址:https://www.cnblogs.com/fanweisheng/p/11097583.html