格式输入输出 cin.width()cout.width()
cin.width和cout.width成员函数
cin.width(n); 控制输入宽度 (默认自动左对齐)
运行原理
若使用char[]作字符串,首先将字符串全部读取 分为个字符块 每个字符块规定为n-1个字符 满足条件的字符块 若某个字符块少于n-1个字符
宽度不足而缺少的字符将用空格进行补齐
若使用string类型作字符串 则字符块规定为n 无需-1
void WidthIN()
{
int width = 4;
char str[20];
cout << "请输入一段文本: \n";
cin.width(width); //设置接受width个字符 为控制输入宽度
while (cin >> str) //cin缓冲区中的字符循环流入str字符串中
{
cin.width(4); //设置接收width-1个字符 为控制输入宽度
cout << str << endl; //输出str
cout <<"数组长度为"<< strlen(str) << endl;//输出每次读取字符串str时 str的长度
}
}
void main()
{
WidthIN();
}
输入6个字符 123ABC和1234ABC 看看是什么效果
可见 输入的6个字符 在经过控制输入宽度之后 超过控制宽度的字符被换行显示
cout.width(n); 控制输出宽度 (默认自动右对齐)
控制输出宽度的原理和运行机制比控制输入要难搞懂一点
运行原理
输出n个字符cout缓冲区 字符自动右对齐 左边宽度不足而缺少的字符用空格不上 当读取到空格或回车符时为读取断开
空格隔开了几组字符串 就 分为几组字符串区块 然后进行分区块显示 每个区块的宽度为设置的输出宽度-1 (分区块也是从右向左分的嗷) 也就是说 只要某个字符串区块 小于 设置的控制输出量 就以右侧为基准向左侧补齐n个空格进行填充
需要注意的是 cout.width和cin.width最大的不同在于 当字符串长度大于设定的控制数量
cin.width将进行按设定值进行分区块 换行显示 且所有区块的字符串长度都不得超过 设定值
cout.width将把大于长度的字符串(未进行空格符分隔) 全部读取 并显示 也就是说 当字符串长度大于设定的控制输出长度 此时设定的长度值将无效 程序将以空格符为读取标志 读取完一个区域的字符串就从缓存中清除一个区域的
字符 直到遇到小于 控制长度的字符串 此时控制长度生效 字符串从右向左补齐
void WidthOUT()
{
int width = 4;//设置控制输出宽度
char str[20];
cout << "请输入一段文本: \n";
while (cin >> str)
{
cout.width(width); //将4个字符输出,设置每次输出的域宽增加1
cout.setf(ios::left);//todo成员setf(ios::left of right) 可以用来重新指定对齐方式
cout.fill('*');//todo成员fill('string') 可以改变填充的字符 例如cout.fill('*') 意为使用*代替空格进行缺少部分的填充
cout << str << endl; //输出str
if (getchar() == '\n')//等待键盘输入流 接收到回车键
{
cout << "控制输出宽度为" << cout.width();//cin.width() 函数在没有参数时 作用为 输出 设置的 控制输入的宽度
}
}
}
void main()
{
WidthOUT();
}
输入6个字符 ABCD EF 看看是什么效果
可见 输入的6个字符 在经过控制输出宽度之后 以空格符为分隔区域 区域块超过控制宽度的字符被换行并靠右换行显示
输入6个字符 ABCEDF ABC 看看是什么效果
补充说明
需要注意的是width()只影响他设置后的下一个输出,再下一个字段输出后,后继的字段被恢复为默认值,比如
cout.width(12);
cout<<A<<B;
则输出A时会以12字段的宽度显示,但显示B时就会以默认的方式显示了
还有两个成员函数 需要知道
cout.setf(ios::left); 成员setf(ios::left of right) 可以用来重新指定对齐方式
cout.fill(’*’); fill(‘string’) 可以改变填充的字符 例如cout.fill(’’) 意为使用代替空格进行缺少部分的填充
使用cout.width()的代码并使用这两个函数的效果
注:这两个函数需放在 cout.width(width); 设置控制输出语句后方才能生效
还有precision()函数设置或返回当前要被显示的浮点变量的位数
例如,下面的代码:
float num = 314.15926535;
cout.precision( 5 );
cout << num;
结果
314.16
还有一些其他的格式控制,这里只是提一下:
ios::dec 以10进制表示整数
ios::hex 以16进制表示整数
ios::oct 以8进制表示整数
setfill(*) 设填充字符为*
setprecision(n) 设显示小数精度为n位
setw(n) 设域宽为n个字符
setiosflags(ios::fixed) 固定的浮点显示
setiosflags(ios::scientific) 指数表示
setiosflags(ios::left) 左对齐
setiosflags(ios::right) 右对齐
setiosflags(ios::skipws) 忽略前导空白
setiosflags(ios::uppercase)16进制数大写输出
setiosflags(ios::lowercase)16进制数小写输出
ios::dec 以10进制表示整数
ios::hex 以16进制表示整数
ios::oct 以8进制表示整数
ios::showbase 为整数添加一个表示其进制的前缀
ios::internal 在符号位和数值的中间插入需要数量的填充字符以使串两端对齐
ios::left 在串的末尾插入填充字符以使串居左对齐
ios::right 在串的前面插入填充字符以使串居右对齐
ios::boolalpha 将bool类型的值以true或flase表示,而不是1或0
ios::fixed 将符点数按照普通定点格式处理(非科学计数法)
ios::scientific 将符点数按照科学计数法处理(带指数域)
ios::showpoint 在浮点数表示的小数中强制插入小数点(默认情况是浮点数表示的整数不显示小数点)
ios::showpos 强制在正数前添加+号
ios::skipws 忽略前导的空格(主要用于输入流,如cin)
ios::unitbuf 在插入(每次输出)操作后清空缓存
ios::uppercase 强制大写字母
–自:对象的基础(结构)项目扩展内容