std:: printf, std:: fprintf, std:: sprintf, std:: snprintf
|
定义于头文件
<cstdio>
|
||
|
int
printf
(
const
char
*
format, ...
)
;
|
(1) | |
|
int
fprintf
(
std::
FILE
*
stream,
const
char
*
format, ...
)
;
|
(2) | |
|
int
sprintf
(
char
*
buffer,
const
char
*
format, ...
)
;
|
(3) | |
|
int
snprintf
(
char
*
buffer,
std::
size_t
buf_size,
const
char
*
format, ...
)
;
|
(4) | (C++11 起) |
从给定位置加载数据,将其转换为等效字符串形式,并将结果写入多种输出目标。
如果对
sprintf
或
snprintf
的调用导致在重叠的对象之间进行复制,则行为是未定义的(例如
sprintf
(
buf,
"%s text"
, buf
)
;
)。
内容参数
format
字符串由普通字节字符(除了
以下格式说明符可用:
返回值
1,2)
成功时写入的字符数量,若出现错误则返回负值。
3)
成功时写入的字符数(不包含终止空字符),若发生错误则返回负值。
4)
若操作成功时,本应写入足够大缓冲区的字符数量(不包含终止空字符);若发生错误,则返回负值。因此,当且仅当返回值非负且小于
buf_size
时,(以空字符终止的)输出内容已完全写入。
说明POSIX 规定,errno 在出错时被设置。它还规定了额外的转换说明,最值得注意的是支持参数重排序( 调用 auto fmt = "sqrt(2) = %f";
int sz = std::snprintf(nullptr, 0, fmt, std::sqrt(2));
std::vector<char> buf(sz + 1); // note +1 for null terminator
std::sprintf(buf.data(), fmt, std::sqrt(2)); // certain to fit
示例
运行此代码
#include <cinttypes> #include <cstdint> #include <cstdio> #include <limits> int main() { const char* s = "Hello"; std::printf("Strings:\n"); // same as std::puts("Strings:"); std::printf("\t[%10s]\n", s); std::printf("\t[%-10s]\n", s); std::printf("\t[%*s]\n", 10, s); std::printf("\t[%-10.*s]\n", 4, s); std::printf("\t[%-*.*s]\n", 10, 4, s); std::printf("Characters:\t%c %%\n", 'A'); std::printf("Integers:\n"); std::printf("\tDecimal: \t%i %d %.6i %i %.0i %+i %i\n", 1, 2, 3, 0, 0, 4,-4); std::printf("\tHexadecimal:\t%x %x %X %#x\n", 5,10,10, 6); std::printf("\tOctal: \t%o %#o %#o\n", 10, 10, 4); std::printf("Floating point:\n"); std::printf("\tRounding:\t%f %.0f %.32f\n", 1.5, 1.5, 1.3); std::printf("\tPadding:\t%05.2f %.2f %5.2f\n", 1.5, 1.5, 1.5); std::printf("\tScientific:\t%E %e\n", 1.5, 1.5); std::printf("\tHexadecimal:\t%a %A\n", 1.5, 1.5); std::printf("\tSpecial values:\t0/0=%g 1/0=%g\n", 0.0/0.0, 1.0/0.0); std::printf("Variable width control:\n"); std::printf("\tright-justified variable width: '%*c'\n", 5, 'x'); int r = std::printf("\tleft-justified variable width : '%*c'\n", -5, 'x'); std::printf("(the last printf printed %d characters)\n", r); std::printf("Fixed-width types:\n"); std::uint32_t val = std::numeric_limits<std::uint32_t>::max(); std::printf("\tLargest 32-bit value is %" PRIu32 " or %#" PRIx32 "\n", val, val); } 可能的输出: 字符串: [ Hello] [Hello ] [ Hello] [Hell ] [Hell ] 字符: A % 整数: 十进制: 1 2 000003 0 +4 -4 十六进制: 5 a A 0x6 八进制: 12 012 04 浮点数: 舍入: 1.500000 2 1.30000000000000004440892098500626 填充: 01.50 1.50 1.50 科学计数法: 1.500000E+00 1.500000e+00 十六进制: 0x1.8p+0 0X1.8P+0 特殊值: 0/0=-nan 1/0=inf 可变宽度控制: 右对齐可变宽度: ' x' 左对齐可变宽度: 'x ' (最后一个printf打印了41个字符) 固定宽度类型: 最大的32位值是 4294967295 或 0xffffffff 另请参阅
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||