当前位置: 首页 > news >正文

格式输入输出 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表示,而不是10 
ios::fixed  将符点数按照普通定点格式处理(非科学计数法) 
ios::scientific  将符点数按照科学计数法处理(带指数域) 
ios::showpoint  在浮点数表示的小数中强制插入小数点(默认情况是浮点数表示的整数不显示小数点) 
ios::showpos  强制在正数前添加+号 
ios::skipws  忽略前导的空格(主要用于输入流,如cin) 
ios::unitbuf  在插入(每次输出)操作后清空缓存 
ios::uppercase  强制大写字母 

–自:对象的基础(结构)项目扩展内容

相关文章:

  • scp和sftp
  • C++ 结构体
  • 中兴事业部你真行
  • C++ 对象的基础(结构及结构指针)
  • 《Linux内核设计与实现》读书笔记(三)- Linux的进程
  • C++联合枚举和类型别名
  • while循环与中断语句break、continue、return以及goto的使用
  • CentOS使用Screen管理会话选项
  • 循环程序跳出(_kbhit()、getch() 、getchar())
  • C++ 类与对象
  • (转) Android中ViewStub组件使用
  • C++ 构造函数与析构函数
  • MFC应用程序中处理消息的顺序,创建窗口的过程关闭窗口的顺序(非模态窗口),打开模式对话框的函数调用顺序...
  • C++ this指针 与 类的继承
  • OpenGL_Qt学习笔记之_07(闪烁的星星)
  • bearychat的java client
  • gf框架之分页模块(五) - 自定义分页
  • go append函数以及写入
  • isset在php5.6-和php7.0+的一些差异
  • leetcode46 Permutation 排列组合
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Magento 1.x 中文订单打印乱码
  • node-glob通配符
  • PAT A1050
  • Python3爬取英雄联盟英雄皮肤大图
  • Quartz初级教程
  • 汉诺塔算法
  • 漂亮刷新控件-iOS
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 如何合理的规划jvm性能调优
  • 深入 Nginx 之配置篇
  • 使用 QuickBI 搭建酷炫可视化分析
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 详解NodeJs流之一
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 优秀架构师必须掌握的架构思维
  • 《码出高效》学习笔记与书中错误记录
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • (七)Java对象在Hibernate持久化层的状态
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (一)u-boot-nand.bin的下载
  • (已解决)什么是vue导航守卫
  • (转)JAVA中的堆栈
  • ... 是什么 ?... 有什么用处?
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .Net 垃圾回收机制原理(二)
  • .NET 指南:抽象化实现的基类
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)