C/C++ 格式化输入输出汇总
本文汇总一下 C 语言 scanf
和 printf
的格式控制方法以及 C++ 的 <iomanip>
库。
C 语言
此处内容来源于 《C Primer Plus (第 6 版)中文版》。
printf() 函数
转换说明
ANSI C 中 printf() 的转换说明(P69,表 4.3:转换说明及其打印的输出结果)
整数
转换说明 | 打印的结果 |
---|---|
%d / %i | 有符号十进制整数 |
%u | 无符号十进制整数 |
%o | 无符号八进制整数 |
%x | 无符号十六进制整数,使用十六进制数 0f |
%X | 无符号十六进制整数,使用十六进制数 0F |
%a / %A | 十六进制数、浮点数和 p 计数法(C99/C11) |
浮点数
转换说明 | 打印的结果 |
---|---|
%e / %E | 浮点数,e 计数法 |
%f | 浮点数,十进制计数法 |
%g / %G | 根据值的不同,自动选择 %f 或 %e / %E。%e / %E 格式用于指数小于-4 或大于等于精度时。 |
%a / %A | 十六进制数、浮点数和 p 计数法(十六进制指数计数法)(C99/C11) |
其他
转换说明 | 打印的结果 |
---|---|
%c | 单个字符**(包括空白字符)** |
%s | 字符串 |
%p | 指针 |
%% | 百分号 |
转换说明修饰符
(P71,表 4.4:printf()的修饰符):
修饰符 | 含义 |
---|---|
标记 | 共 5 种(-, +, 空格, # , 0) |
数字 | 最小字段宽度(不够自动变宽) |
.数字 | 精度(具体见下边说明) |
h | 和整型转换说明一起使用,表示 short int 或 unsigned short int |
hh | 和整型转换说明一起使用,表示 signed char 或 unsigned char |
j | 和整型转换说明一起使用,表示 intmax_t 或 uintmax_t (这些类型定义在 <stdint.h> 中) |
l | 和整型转换说明一起使用,表示 long int 或 unsigned long int(和浮点型转换说明构成 %lf,表示 double) |
ll | 和整型转换说明一起使用,表示 long long int 或 unsigned long long int(C99) |
L | 和浮点转换说明一起使用,表示 long double 类型的值 |
t | 和整型转换说明一起使用,表示 ptrdiff_t (ptrdiff_t 是两个指针差值的类型,C99) |
z | 和整型转换说明一起使用,表示 size_t (size_t 是 sizeof 返回的类型,C99) |
上边的 .数字:
对于 %e、%E、%f,表示小数点右边数字的位数;
对于 %g、%G,表示有效数字的最大位数;
对于 %s,表示待打印字符的最大数量;
对于整型转换,表示待打印数字的最小位数,如有必要,使用前导 0 来达到这个位数。
只是用 . 表示其后跟随了一个 0,所以 %.f 和 %.0f 相同。
(P72,表 4.5:printf()中的标记):
标记 | 含义 |
---|---|
- | 左对齐 |
+ | 有符号值前加正负号 |
空格 | 有符号值正不加,负加负号 |
# | 把结果转换为另一种形式,具体看下边 |
0 | 对于数值格式,用前导 0 代替空格填充字段宽度。对于整数格式,如果出现-标记或者指定精度,则忽略该标记 |
# 的说明:
%o:以 0 开始;
%x / %X:以 0x / 0X 开始;
所有浮点格式:保证即使后边没有任何数字,也打印一个小数点字符;
%g / %G:防止结果后边的 0 被删除。
scanf()函数
大部分与上边相同,只讲不一样的。
(P80,表 4.7:scanf()转换说明中的修饰符):
转换说明 | 含义 |
---|---|
* | 抑制赋值 |
数字 | 最大字符宽度。输入达到这个宽度或者第一次遇到空白字符时停止。 |
scanf() 的返回值是成功读取的项数。如果没有读取任何项,则返回 0;如果检测到“文件结尾”,返回 EOF (EOF 是定义 <stdio.h> 中定义的特殊值,一般用 #define 定义为 -1)。
**注意:**输入数字的时候,在不设置分隔符号时,scanf()默认使用空白字符进行分隔;但是输入字符时,空白字符不会被忽略,而是被顺利读入。
比如下边这道题:
有如下程序段:
int a1, a2;
char c1, c2;
scanf("%d%c%d%c", &a1, &c1, &a2, &c2);
若要求 a1, a2, c1, c2 的值分别为 10, 20, A, B,正确的数据输入是( ):
A. 10A20 B<CR>
B. 10 A 20 B<CR>
C. 10 A20B<CR>
D. 10A 20B<CR>
正确答案为 D。
C++
参考:【C++】C++标准库之 iomanip 库(格式输入输出)_Jacky_Feng 的博客-CSDN 博客
控制符 | 作用 |
---|---|
oct | 八进制输入/输出 |
dec | 十进制输入/输出 |
hex | 十六进制输入/输出 |
setbase(n) | 设置为 n 进制 (n = 8, 10, 16) |
setprecision(n) | 设置浮点数的有效数字为 n 位 |
setfill(c) | 设置字符填充为 c |
setw(n) | 设置宽度 |
setiosflags(ios::fixed) | 设置浮点数以固定的小数位数显示 |
setiosflags(ios::scientific) | 设置浮点数以科学计数法表示 |
setiosflags(ios::left) | 输出左对齐 |
setiosflags(ios::right) | 输出右对齐 |
setiosflags(ios::skipws) | 忽略前导空格 |
setiosflags(ios::uppercase) | 在以科学计数法输出 E 与十六进制输出 X 以大写输出,否则小写 |
setiosflags(ios::showpos) | 输出正数时显示”+“号 |
setiosflags(ios::showpoint) | 强制显示小数点 |
resetiosflags() | 终止已经设置的输出格式状态,在括号中应指定内容 |