14.5.3 输入流与域宽
iostream类中定义的成员函数,如width、fill和precsion,以及iomanip中定义的一些有参控制符,如setfill、setw和setprecision等,都适用于输入流,但实际只有少数几个真正能影响输入流对象,本节介绍的是使用最多的用法,即字符数组与域宽。
在对char型数组进行输入时,一个重要的问题是保证输入字符串的长度小于数组的大小,这在第3章中已经介绍过,流类库提供了width函数和setw控制符,用于限定输入的字符个数,如下所示。
cin.width(n):设置读入最多n-1个字符。最后1个要放'\0'。 setw(n):与cin.width(n)等价。
如下述示例代码14.17所示。
代码14.17 字符数组输入与域宽CharArraySample
<——————————-文件名:example1417.cpp————————————————-> 01 #include<iostream> 02 #include<iomanip> 03 using namespace std; 04 int main() 05 { 06 char x[5];//开辟一块字符空间,大小为5 07 cin>>setw(5)>>x;//只接受4个字符(5-1) 08 cout<<x<<endl; 09 return 0; 10 }
输出结果如下所示。
123456789 1234
【代码解析】代码中,字符数组x的大小为5,因此只能用来存放4个字符,第7行的语句“cin>>setw(5)>>x;”会自动对输入的字符串进行截断,只取前4个放入x中,其余字符仍遗留在输入缓冲区中。
注意
同输出流中width函数和setw控制符的用法一样,输入流中域宽的设置也只是“一次有效”,只作用于最近的>>操作符上。