cout输出格式控制
如果要在输出流中加入格式控制符则要加载头文件:#include <iomanip>
这里面iomanip的作用比较多:
主要是对cin,cout之类的一些 *** 纵运算子,比如setfill,setw,setbase,setprecision等等。它是I/O流控制头文件,就像C里面的格式化输出一样以下是一些常见的控制函数的:
dec 置基数为10 相当于"%d"
hex 置基数为16 相当于"%X"
oct 置基数为8 相当于"%o" //作用永久
sample:
cout<<12<<hex<<12<<oct<<12<<12;output 12c1414
setprecision(n) 设显示小数精度为n位 //作用永久
sample:
setf(ios:fixed);
cout<<setprecision(2)<<2345<<endl; ouput 234 //注意先用setf(ios::fixed);否则结果自己测试下
setw(n) 设域宽为n个字符 //作用临时
这个控制符的意思是保证输出宽度为n。如:
cout<<setw(3)<<1<<setw(3)<<10<<setw(3)<<100; 输出结果为
1 10100 (默认是右对齐)当输出长度大于3时(<<1000),setw(3)不起作用。
setfill(c) 设填充字符为c
setioflags(ios::fixed) 固定的浮点显示
setioflags(ios::scientific) 指数表示
sample cout<<setiosflags(ios::fixed)<<setprecision(2)<<2345<<endl; output 234
setiosflags(ios::left) 左对齐
setiosflags(ios::right) 右对齐
setiosflags(ios::skipws) 忽略前导空白
setiosflags(ios::uppercase) 16进制数大写输出
setiosflags(ios::lowercase) 16进制小写输出
setiosflags(ios::showpoint) 强制显示小数点
setiosflags(ios::showpos) 强制显示符号
sample: cout<<setiosflags(ios::uppercase)<<hex<<12<<15<<endl; output CF
cout<<setioflags(ios::showpoint)<<x<<endl;若float x=1,则output 1000000 不使用直接输出1
cout<<setiosflags(ios::showpos)<<1<<endl;output +1
//使用标准C++编写
#include <iostream>
#include <iomanip>//精度设置必须包括的头文件
using namespace std;
int main()
{
double a=35;
int b=10;
//方法一: *** 作符函数的格式控制
//coutprecision(2),设置精度为2
//right:设置左对齐;fixed:控制浮点型输出格式;
//setw(5):设置输出位宽为5
cout<<right<<fixed<<setw(5)<<setfill('0')
<<setprecision(2)<<a<<endl; //输出结果为0350
//方法二:IOS类成员函数的格式控制
coutprecision(4); //setprecision(4),设置精度为4
cout<<a<<endl; //输出结果为35000
//setfill('0'):设置填充字符为'0'
//static_cast<double>(b):将整型的b,
//生成一个双精度浮点型副本进行 *** 作,而不改变其值和类型
cout<<fixed<<setfill('0')<<setprecision(2)
<<fixed<<static_cast<double>(b)<<endl;//输出1000
return 0;
}
方法很多种啦,我们可以这样写:
/一个使用填充,宽度,对齐方式的例子/
#include <iostreamh>
void main()
{
cout<<"第一章"<<endl;
cout<<" ";
coutsetf(ios::left); //设置对齐方式为left
coutwidth(7); //设置宽度为7,不足用空格填充
cout<<"11";
cout<<"什么是C语言";
coutunsetf(ios::left); //取消对齐方式,用缺省right方式
coutfill(’’); //设置填充方式
coutwidth(30); //设置宽度,只对下条输出有用
cout<<1<<endl;
cout<<" ";
coutwidth(7); //设置宽度
coutsetf(ios::left); //设置对齐方式为left
coutfill(’ ’); //设置填充,缺省为空格
cout<<"111";
cout<<"C语言的历史";
coutunsetf(ios::left); //取消对齐方式
coutfill(’’);
coutwidth(30);
cout<<58<<endl;
coutfill(’ ’);
cout<<"第二章"<<endl;
}
我们多次设置了宽度,为的是使我们的间距能一致,也使用了对齐方式,为的是使我们的数据能对齐显示,看起来美观。我们还使用了填充方式。我们下面用 *** 纵算子来实现也是可以的。
/一个使用填充,宽度,对齐方式的例子/
#include <iomaniph>
void main()
{
cout<<"第一章"<<endl;
cout<<" ";
cout<<setiosflags(ios::left)<<setw(7); //设置宽度为7,left对齐方式
cout<<"11";
cout<<"什么是C语言";
cout<<resetiosflags(ios::left); //取消对齐方式
cout<<setfill(’’)<<setw(30)<<1<<endl; //宽度为30,填充为’’输出
cout<<setfill(’ ’); //恢复填充为空格
cout<<" ";
cout<<setw(7)<<setiosflags(ios::left); //设置宽度为7,left对齐方式
cout<<"111";
cout<<"C语言的历史";
cout<<resetiosflags(ios::left); //取消对齐方式
cout<<setfill(’’)<<setw(30)<<58<<endl; //宽度为30,填充为’’输出
cout<<setfill(’ ’)<<"第二章"<<endl;
}
我们输出了同样的效果,不过依我的性格,我更喜欢用 *** 纵算子来进行格式化输出。最后我们看看浮点数的格式输出,如下例:
/关于浮点数的格式/
#include <iostreamh>
void main()
{
float f=20/30,f1=0000000001,f2=-99;
cout<<f<<’ ’<<f1<<’ ’<<f2<<endl; //正常输出
coutsetf(ios::showpos); //强制在正数前加+号
cout<<f<<’ ’<<f1<<’ ’<<f2<<endl;
coutunsetf(ios::showpos); //取消正数前加+号
coutsetf(ios::showpoint); //强制显示小数点后的无效0
cout<<f<<’ ’<<f1<<’ ’<<f2<<endl;
coutunsetf(ios::showpoint); //取消显示小数点后的无效0
coutsetf(ios::scientific); //科学记数法
cout<<f<<’ ’<<f1<<’ ’<<f2<<endl;
coutunsetf(ios::scientific); //取消科学记数法
coutsetf(ios::fixed); //按点输出显示
cout<<f<<’ ’<<f1<<’ ’<<f2<<endl;
coutunsetf(ios::fixed); //取消按点输出显示
coutprecision(18); //精度为18,正常为6
cout<<f<<’ ’<<f1<<’ ’<<f2<<endl;
coutprecision(6); //精度恢复为6
}
同样,我们也一样能用 *** 纵算子实现同样的功能:
/关于浮点数的格式/
#include <iomaniph>
void main()
{
float f=20/30,f1=0000000001,f2=-99;
cout<<f<<’ ’<<f1<<’ ’<<f2<<endl; //正常输出
cout<<setiosflags(ios::showpos); //强制在正数前加+号
cout<<f<<’ ’<<f1<<’ ’<<f2<<endl;
cout<<resetiosflags(ios::showpos); //取消正数前加+号
cout<<setiosflags(ios::showpoint); //强制显示小数点后的无效0
cout<<f<<’ ’<<f1<<’ ’<<f2<<endl;
cout<<resetiosflags(ios::showpoint); //取消显示小数点后的无效0
cout<<setiosflags(ios::scientific); //科学记数法
cout<<f<<’ ’<<f1<<’ ’<<f2<<endl;
cout<<resetiosflags(ios::scientific); //取消科学记数法
cout<<setiosflags(ios::fixed); //按点输出显示
cout<<f<<’ ’<<f1<<’ ’<<f2<<endl;
cout<<resetiosflags(ios::fixed); //取消按点输出显示
cout<<setprecision(18); //精度为18,正常为6
cout<<f<<’ ’<<f1<<’ ’<<f2<<endl;
cout<<setprecision(6); //精度恢复为6
}cout 默认输出格式相当于 c 里 %g 格式 -- 简略格式,例如 12300000 输出为 123
123450000 输出为12345
用 cout << fixed << 默认输出格式相当于 c 里 %f 和 %lf 格式
如果想指定 输出小数位数,则要 加 头文件 #include <iomanip>, 调用 setprecision(多少位)。
=======
例子:
#include <iostream>
#include <iomanip>
using namespace std;
main(){
double x=1230;
cout << x << endl;
cout << fixed << x << endl;
cout << setprecision(2) << x << endl;
}
例子输出:
123
123000000
12300答案是字符串存在的位置
f1返回一个字符串的首地址,这个字符串由编译程序保存在程序的初始化段中,这个段中一般保存你程序中出现的常量;
f2的ret变量保存的仍然是初始化段中的字符串首地址;
f3在堆中临时申请了一个数组,并由系统将初始化段中的字符串赋值到这个数组,现在f3返回的地址位于堆中,在f3执行结束后,堆中申请的这个字符串数组ret被释放,堆又开始为cout服务,申请的存储区会覆盖原来的ret位置,所以出现乱码一点也不奇怪。1、当一个函数作为函数参数时,参数总是先要计算出来,外边的函数才能运行的。
2、其实<<也是一个函数,是一个运算符的重载。
3、所以f(a)作为cout<<的一个参数,f(a)先运行,然后这句cout才输出。
4、所以先输出f(a)里面的cout<<c<<endl; ,就是2,然后才执行cout<<a<<" "<<f(a)<<endl;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)