格式控制符?流操作算子
当需要输出浮点数时保留小数点后面几位数,以十六进制输出整数,输出整数时按几个数字的宽度输出,宽度不足时左边(默认)/右边补“0”,等等。C语言中的 printf() 函数使用以% 开头的格式控制符,例如 %X、%d、%lf、%.6f、%6d 等(相关:"printf"和"wprintf"规范 | Microsoft Docs);C++中的 cout 对象则使用格式控制符(流操作算子)或者成员函数进行控制。
使用格式控制符(.c)
C
RUN
C++
RUN
流操纵算子可以用来干什么?
注意
? ? ? ? ?使用流操作算子????????
关于SETW
使用格式控制符(.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.csdn.net/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;
}
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
流操纵算子可以用来干什么?
注意
使用流操纵算子需要?#include <iostream>?#include <iomanip>
<iostream> ?库使用?#include <ios> 、#include <streambuf> 、#include <istream> ?和?#include <ostream> ?语句。
iomanip相关内容(MicrosoftDocs)<iomanip> 函数
使用流操作算子
C++ 中常用的输出流操纵算子如表 1 所示,它们都是在头文件 iomanip 中定义的;要使用这些流操纵算子,必须包含该头文件。
注意:“流操纵算子”一栏中的星号* 不是算子的一部分,星号表示在没有使用任何算子的情况下,就等效于使用了该算子。例如,在默认情况下,整数是用十进制形式输出的,等效于使用了 dec 算子。
C++ 流操纵算子
流操纵算子 | 作 ?用 |
---|
*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 时,同样只影响下一次的输入。
|