BlockLune's Blog

Home Tags About

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

published at 2022-10-19
iomanip 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()默认使用空白字符进行分隔;但是输入字符时,空白字符不会被忽略,而是被顺利读入。

比如下边这道题:

有如下程序段:

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