C/C++ printf/cout格式化输出相关合集

本文详细介绍了C/C++中的printf和cout流操作符,包括格式控制符的使用,如%d, %f, %x等,以及如何控制输出的精度、进制和对齐方式。通过实例展示了setw, setprecision, setfill等流操纵算子的实际应用。
摘要由CSDN通过智能技术生成

 

格式控制符 流操作算子

当需要输出浮点数时保留小数点后面几位数,以十六进制输出整数,输出整数时按几个数字的宽度输出,宽度不足时左边(默认)/右边补“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;
}
//这是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 算子。

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 时,同样只影响下一次的输入。

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

O&REO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值