格式控制符 流操作算子
当需要输出浮点数时保留小数点后面几位数,以十六进制输出整数,输出整数时按几个数字的宽度输出,宽度不足时左边(默认)/右边补“0”,等等。C语言中的 printf() 函数使用以%
开头的格式控制符,例如 %X、%d、%lf、%.6f、%6d 等(相关:"printf"和"wprintf"规范 | Microsoft Docs);C++中的 cout 对象则使用格式控制符(流操作算子)或者成员函数进行控制。
使用格式控制符(.c)
控制符 | 作用 |
---|---|
%d | 用来输出有符号的十进制整数(包括char类型 char是字符指针数据类型) |
%u | 用来输出无符号的十进制整数(包括char类型) |
%o | 用来输出无符号的八进制整数oct |
%x | 用来输出无符号的十六进制整数hex |
%c | 用来输出单个字符 |
%s | 用来输出一个字符串 |
%f | 用来输出小数形式的十进制浮点数(输入时小数形式和指数形式都可以识别)注意double用%lf输出 |
%e | 用来输出指数形式的十进制浮点数(输入时小数形式和指数形式都可以识别) |
%g | 用来输出指数形式和小数形式两者中较短的十进制浮点数(输入时小数形式和指数形式都可以识别) |
% [-] [0] [m/m.n][l/h] | 其中[ ]里面的内容是可选的 控制:左对齐、补齐、宽度、长短型、浮点精度 |
-:表示左对齐,缺省情况下为右对齐(若没规定输出数据的宽度则为左对齐)。
0:当规定输出数据的宽度时,所输出数据实际的宽度小于规定的宽度,则在左边用“0”补齐。
m/m.n:m规定了输出数据的宽度(位数),若数据实际的宽度大于m,则突破m的限制全部输出,反之, 将数据全部输出之后用空格进行左补齐;对于实数n是指小数点后的位数,若n小于小数点后实际的位数,则按四舍五入原则进行截取;对于字符串,n表示从左至右截取的字符个数。
l/h:l表示长整型数据(可用于%ld。%lo,%lx,%lu),以及double型数据(%lf或%le);h表示短整型数据(可用于%hd。%ho,%hx)。
f表示的浮点数精度为6, 若浮点数的实际小数位长大于6,则截取6位,第7位四舍五入;若浮点数的实际小数位数小于6,则后补0。如 1.23转换成1.230000;1.23456789转换成1.234568。
C
#include<stdio.h>
int main()
{
double eg=123.456;
printf("1)%f\n",eg);
printf("2)%e\n",eg);
printf("3)%g\n",eg);
printf("4)%lf\n",eg);
printf("5)%2f\n",eg);
printf("6)%4f\n",eg);
printf("7)%10f\n",eg);
printf("8)%12f\n",eg);
printf("9)%22f\n",eg);
printf("10)%22.2f\n",eg);
printf("11)%22.6f\n",eg);
printf("12)%-22f\n",eg);
printf("13)%022f\n",eg);
printf("%");//无效
printf("文字和%");//无效
printf("文字和%%");//有效
printf("\n");
printf("%%");//输出%写法
printf("\n");
printf("%%%%");//输出三个%
return 0;
}
RUN
1)123.456000
2)1.234560e+002
3)123.456
4)123.456000
5)123.456000
6)123.456000
7)123.456000
8) 123.456000
9) 123.456000
10) 123.46
11) 123.456000
12)123.456000
13)000000000000123.456000
文字和文字和%
%
%%
C++
#include <iostream>
#include<iomanip>
using namespace std;
//进制算法https://blog.youkuaiyun.com/hcmony/article/details/75530067
int main()
{
cout << "Hello world!" << endl;
cout<<setprecision(3)<<12.2675<<endl;//有效位
double a=123.56789;
cout<<fixed<<setprecision(3)<<a*1000<<endl;//小数点后
cout<<scientific<<setprecision(3)<<a*1000<<endl;//科学计数
cout<<setfill('0')<<setw(5)<<10<<20<<endl;//填充设置长
cout<<hex<<17<<endl;//hex16进制,oct8进制
int d=22,b=16,c=17;
cout <<" 十进制 :d="<<d<<" b="<<b<<" c="<<c<< endl;
cout <<"十六进制:d="<<hex<<d<<" b="<<b<<" c="<<c<< endl;
cout <<" 八进制 :d="<<oct<<d<<" b="<<b<<" c="<<c<< endl;
#include <iostream>
int n = 141;
//1) 分别以十六进制、十进制、八进制先后输出 n
cout << "1)" << hex << n << " " << dec << n << " " << oct << n << endl;
double x = 1234567.89, y = 12.34567;
//2)保留5位有效数字
cout << "2)" << setprecision(5) << x << " " << y << " " << endl;
//3)保留小数点后面5位
cout << "3)" << fixed << setprecision(5) << x << " " << y << endl;
//4)科学计数法输出,且保留小数点后面5位
cout << "4)" << scientific << setprecision(5) << x << " " << y << endl;
//5)非负数显示正号,输出宽度为12字符,宽度不足则用 * 填补
cout << "5)" << showpos << fixed << setw(12) << setfill('*') << 12.1 << endl;
//6)非负数不显示正号,输出宽度为12字符,宽度不足则右边用填充字符填充
cout << "6)" << noshowpos << setw(12) << left << 12.1 << endl;
//7)输出宽度为 12 字符,宽度不足则左边用填充字符填充
cout << "7)" << setw(12) << right << 12.1 << endl;
//8)宽度不足时,负号和数值分列左右,中间用填充字符填充
cout << "8)" << setw(12) << internal << -12.1 << endl;
cout << "9)" << 12.1 << endl;
return 0;
}
//这是c的进制转换
int main()
{
printf("%#c,%#d,%#u\n", 'A', 99, 00);
printf("%#o\n", 10); // o 八进制 12
printf("%#x\n", 10); // ox 十六进制 a
/*#控制前导显示*/
return 0;
}
C的进制转换结果
A,99,0
012
0xa
RUN
需要注意的是,setw() 算子所起的作用是一次性的,即只影响下一次输出。每次需要指定输出宽度时都要使用 setw()。因此可以看到,第 9) 行的输出因为没有使用 setw(),输出的宽度就不再是前面指定的 12 个字符。
Hello world!
12.3
123567.890
1.236e+005
0001020
11
十进制 :d=16 b=10 c=11
十六进制:d=16 b=10 c=11
八进制 :d=26 b=20 c=21
1)8d 141 215
2)1.23457e+006 1.23457e+001
3)1234567.89000 12.34567
4)1.23457e+006 1.23457e+001
5)***+12.10000
6)12.10000****
7)****12.10000
8)-***12.10000
9)12.10000
流操纵算子可以用来干什么?
- 设置整数的进制(
hex
16
进制dec
10
进制(默认)otc
8
进制) - 设置浮点数的精度(
setprecision
) setprecision(streamsize Prec); - 设置域宽(
setw
) setw(streamsize Wide); - 设置对齐格式等(左对齐、右对齐等)
cout<<left<<setfill('0')<<setw(5)<<123; //输出为 12300
- 其它功能及自定义流操纵算子(待补充)
注意
使用流操纵算子需要 #include <iostream> #include <iomanip>
<iostream>
库使用 #include <ios>
、#include <streambuf>
、#include <istream>
和 #include <ostream>
语句。
iomanip相关内容(MicrosoftDocs)<iomanip> 函数
使用流操作算子
C++ 中常用的输出流操纵算子如表 1 所示,它们都是在头文件 iomanip 中定义的;要使用这些流操纵算子,必须包含该头文件。
注意:“流操纵算子”一栏中的星号
*
不是算子的一部分,星号表示在没有使用任何算子的情况下,就等效于使用了该算子。例如,在默认情况下,整数是用十进制形式输出的,等效于使用了 dec 算子。
流操纵算子 | 作 用 | |
---|---|---|
*dec | 以十进制形式输出整数 | 常用 |
hex | 以十六进制形式输出整数 | |
oct | 以八进制形式输出整数 | |
fixed | 以普通小数形式输出浮点数 | |
scientific | 以科学计数法形式输出浮点数 | |
left | 左对齐,即在宽度不足时将填充字符添加到右边 | |
*right | 右对齐,即在宽度不足时将填充字符添加到左边 | |
setbase(b) | 设置输出整数时的进制,b=8、10 或 16 | |
setw(w) | 指定输出宽度为 w 个字符,或输人字符串时读入 w 个字符 | |
setfill(c) | 在指定输出宽度的情况下,输出的宽度不足时用字符 c 填充(默认情况是用空格填充) | |
setprecision(n) | 设置输出浮点数的精度为 n。 在使用非 fixed 且非 scientific 方式输出的情况下,n 即为有效数字最多的位数,如果有效数字位数超过 n,则小数部分四舍五人,或自动变为科学计 数法输出并保留一共 n 位有效数字。 在使用 fixed 方式和 scientific 方式输出的情况下,n 是小数点后面应保留的位数。 | |
setiosflags(flag) | 将某个输出格式标志置为 1 | |
resetiosflags(flag) | 将某个输出格式标志置为 0 | |
boolapha | 把 true 和 false 输出为字符串 | 不常用 |
*noboolalpha | 把 true 和 false 输出为 0、1 | |
showbase | 输出表示数值的进制的前缀 | |
*noshowbase | 不输出表示数值的进制.的前缀 | |
showpoint | 总是输出小数点 | |
*noshowpoint | 只有当小数部分存在时才显示小数点 | |
showpos | 在非负数值中显示 + | |
*noshowpos | 在非负数值中不显示 + | |
*skipws | 输入时跳过空白字符 | |
noskipws | 输入时不跳过空白字符 | |
uppercase | 十六进制数中使用 A~E。若输出前缀,则前缀输出 0X,科学计数法中输出 E | |
*nouppercase | 十六进制数中使用 a~e。若输出前缀,则前缀输出 0x,科学计数法中输出 e。 | |
internal | 数值的符号(正负号)在指定宽度内左对齐,数值右对 齐,中间由填充字符填充。 |
关于SETW
在读入字符串时,setw() 还能影响 cin 的行为。例如下面的程序:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
string s1, s2;
cin >> setw(4) >> s1 >> setw(3) >> s2;
cout << s1 << "," << s2 << endl;
return 0;
}
输入:
1234567890
程序的输出结果是:
1234,567
说明setw(4)
使得读入 s1 时,只读入 4 个字符,其后的setw(3)
使得读入 s2 时只读入 3 个字符。
setw() 用于 cin 时,同样只影响下一次的输入。