C/C++ 格式化输入输出汇总

本文汇总一下 C 语言 scanfprintf 的格式控制方法以及 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 () 默认使用空白字符进行分隔;但是输入字符时,空白字符不会被忽略,而是被顺利读入。

比如下边这道题:

有如下程序段:

1
2
3
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() 终止已经设置的输出格式状态,在括号中应指定内容

更多请见:iomanip CPP 官方教程 _w3cschool