cin.width()和cout.width()问题

前言

最近在跟着FishC大佬学C++,碰到了一个很有趣的输入输出问题,多方查资料,有了点心得,记录一下。

cin与cout的功能虽然不同,但它们有许多类似点,如都可以指定域宽。cin的输入域宽可以使用操作符setw指定,也可使用cin.width函数成员指定。cin在读入一个字符串时,不能根据字符数组的长度自动读入字符,如果用户输入过多的字符,超过了字符数组的长度,cin会将多余字符存储到该数组的后面,这就有可能覆盖其他变量。如果我们为其指定了输入域宽,就可解决这一问题。

如果所需的宽度比设置的域宽小,空位用填充字符填充。如果显示数据所需的宽度比设置的域宽大,系统输出所有位。域宽设置仅对下一行流读入或流插入操作有效,在一次操作完后被置0。

正文

#include <iostream>

using namespace std;

int main()
{
      int width = 4;
      char str[20];

      cout << "请输入一段文本: \n";
      cin.width(5);	//cin>>str;实际只能提取4个字符,str最后一个是空字符,其他的放在流中等待接受。 

      while( cin >> str )
      {
            cout.width(width++);	//将4个字符输出,设置每次输出的域宽增加1 
            cout << str << endl;	//输出str 
            cin.width(5);			//设置接受4个字符 
      }

      return 0;
}

如果输入文本:May You Always Remember How Precious You Are!

结果如下所示:

cin.width()的域宽一直为5,由于存在最后一个字符是空字符的情况,所以实际上每次只读取4个字符,其他的字符放在流中等待下次接受。 

第一行输出 May, 此时,cin.width = 5,cout.width = 4,遇到空格自动停止接收,位数不足4位,前补一个空格。

第二行输出  You,此时,cin.width = 5,cout.width = 5,遇到空格自动停止接收,所以所以读入3个字符,输出5个,不足前面补上两个空格。

以下以此类推,所以才会出现如此的输出结构。

 

`cout.width` 是 C++ 中的一个 I/O 格式化控制符,用于设置输出宽度。具体来说,它可以用于控制输出的最小宽度,以便输出更加美观易读。 下面是代码的逐行逐段解释: ```c++ #include <iostream> #include <iomanip> using namespace std; int main() { cout << "Input a number: "; int num; cin >> num; cout << "The number you input is: "; cout.width(10); cout.fill('*'); cout << num << endl; return 0; } ``` - `#include <iostream>` `#include <iomanip>` 是 C++ 中用于输入输出流格式化输出的标准库头文件。 - `using namespace std;` 表示使用 `std` 命名空间,方便我们在代码中直接使用 `cout` `cin` 等标准库中的函数。 - `cout << "Input a number: ";` 输出提示信息,要求用户输入一个整数。 - `int num; cin >> num;` 从标准输入流中读取一个整数,并将其赋值给变量 `num`。 - `cout << "The number you input is: ";` 输出提示信息,告诉用户程序将输出他们输入的数字。 - `cout.width(10);` 设置输出宽度为 10 个字符。这意味着,如果要输出的数字不足 10 个字符宽度,将会用空格或其他填充字符来填充。如果要输出的数字超过 10 个字符宽度,则会被截断。 - `cout.fill('*');` 设置填充字符为 `*`,这意味着如果要输出的数字不足 10 个字符宽度,将会用 `*` 字符来填充。 - `cout << num << endl;` 输出变量 `num` 的值,并换行。由于之前设置了输出宽度填充字符,这里输出的数字将会以 10 个字符的宽度为基准,并用 `*` 字符进行填充。 最后程序返回 0,表示正常结束。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值