cin和cout
输入/输出是一种数据传送操作,可以看作是字符序列在主机和外设之间的流动。C++中将数据从一个对象到另一个数据对象的流动抽象为“流”。流具有方向性:流既可以表示数据从内存中传送到某个设备,即与输出设备相联系的流称为输出流;也可以表示数据从某个设备传送给内存中的变量,即与输入设备相联系的流称为输入流。这些流的定义在头文件iostream.h中。流通过重载运算符“>>”和“<<”执行输入输出操作。输入操作是从流中获取数据,因此“>>”称为提取运算符。输出操作是向流中插入数据,因此“<<”称为插入运算符。cin和cout是预定义的标准流对象。cin是标准输入,即键盘输入;cout是标准输出,即屏幕输出。
3.1.1 cin与提取运算符>>
cin是与标准输入设备相连接的预定义istream类的流对象,称为源。当程序需要执行键盘输入时,可以使用提取运算符“>>”从cin输入流中提取不同数据类型的数据。提取运算符可以从同一个输入流中提取多个数据项给其后的多个变量赋值,要求输入流的数据项用空格进行分隔。
3.1.2 cout与插入运算符<<
cout是与标准输出设备相连接的预定义的ostream类流对象,称为汇。当程序需要在屏幕上显示输出时,可以使用插入运算符“<<”向cout流中插入各种不同类型的数据。插入运算符可以向同一个输出流中插入多个数据项。
3.1.3 I/O流格式控制符
当使用cin和cout进行数据的输入、输出时,无论什么类型的数据,都能够自动按照正确的默认格式处理。如需进行特殊的格式设置,需要用I/O 流格式控制符对格式进行控制。这些格式控制符可以直接嵌入到输入/输出语句中来实现I/O流格式控制。控制符的定义在头文件iomanip.h中。
表3-1 I/O流常用控制符
表3-1 I/O流常用控制符
控制符 | 描述 |
Dec | 置基数为10 |
Hex | 置基数为16 |
Oct | 置基数为8 |
Endl | 插入换行符,并刷新流 |
Ends | 插入空字符 |
setfill(c) | 设填充字符为c |
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进制数小写输出 |
★ ★ 3.2 printf和scanf
printf和scanf是标准格式输入输出函数,是C程序中惟一的输入输出格式,其定义在头文件stdio.h中。在C++程序中,I/O流完全代替了它们。printf和scanf语句只是作为一个补充而使用。
3.2.1 printf函数
格式:printf(格式控制,输出表列)
"格式控制"是用双引号括起来的字符串,包括格式说明和普通字符。格式说明是由"%"和格式字符组成,作用是将输出的数据转换成指定的格式输出。普通字符原样照印。
(1) d格式符。用来输出10进制整数,包括下面3种用法。
%d,格式符,按整型数的实际长度输出。
%md,m为指定的输出字段宽度。如果数据的位数小于m,右对齐,左补空格,若大于m,按实际位数输出。
%ld,输出长型数据。
(2)o格式符,以8进制形式输出整数。
(3)x格式符,以16进制形式输出整数。
(4)u格式符,以10进制形式输出无符号数。
(5)c格式符,输出一个字符。
(6)s格式符,用来输出一个字符串。
%s,按字符串的实际长度输出,包括下面4种用法。
%ms,m为指定的输出字段宽度,如果字符串的长度小于m,右对齐,左补空格,若大于m,按实际位数输出。
%-ms,m为指定的输出字段宽度,如果字符串的长度小于m,左对齐,右补空格,若大于m,按实际位数输出。
%m.ns,m为指定的输出字段宽度,n为输出字符数。如果nm,m自动取n值,保证n个字符正常输出。
%-m.ns,m为指定的输出字段宽度,n为输出字符数。如果nm,m自动取n值,保证n个字符正常输出。
(7)f格式符,用来输出实数,包括下面3种用法。
%f,整数部分全部输出并输出6位小数。
%m.n ,m为指定的输出字段宽度,n为小数位数。如果数值长度小于m,右对齐,左补空格。
%-m.n ,m为指定的输出字段宽度,n为小数位数。如果数值长度小于m,左对齐,右补空格。
(8)e格式符,以指数形式输出实数,包括下面3种用法。
%e,输出6位小数和5位指数部分共占13位。
%m.ne,m为指定的输出字段宽度,n为小数位数。如果数值长度小于m,右对齐,左补空格。
%-m.ne,m为指定的输出字段宽度,n为小数位数。如果数值长度小于m,左对齐,右补空格。
(9)g格式符,根据数值大小自动选取f格式或e格式输出。
表3-2 printf格式符
表3-3 printf附加格式符
"格式控制"是用双引号括起来的字符串,包括格式说明和普通字符。格式说明是由"%"和格式字符组成,作用是将输出的数据转换成指定的格式输出。普通字符原样照印。
(1) d格式符。用来输出10进制整数,包括下面3种用法。
%d,格式符,按整型数的实际长度输出。
%md,m为指定的输出字段宽度。如果数据的位数小于m,右对齐,左补空格,若大于m,按实际位数输出。
%ld,输出长型数据。
(2)o格式符,以8进制形式输出整数。
(3)x格式符,以16进制形式输出整数。
(4)u格式符,以10进制形式输出无符号数。
(5)c格式符,输出一个字符。
(6)s格式符,用来输出一个字符串。
%s,按字符串的实际长度输出,包括下面4种用法。
%ms,m为指定的输出字段宽度,如果字符串的长度小于m,右对齐,左补空格,若大于m,按实际位数输出。
%-ms,m为指定的输出字段宽度,如果字符串的长度小于m,左对齐,右补空格,若大于m,按实际位数输出。
%m.ns,m为指定的输出字段宽度,n为输出字符数。如果nm,m自动取n值,保证n个字符正常输出。
%-m.ns,m为指定的输出字段宽度,n为输出字符数。如果nm,m自动取n值,保证n个字符正常输出。
(7)f格式符,用来输出实数,包括下面3种用法。
%f,整数部分全部输出并输出6位小数。
%m.n ,m为指定的输出字段宽度,n为小数位数。如果数值长度小于m,右对齐,左补空格。
%-m.n ,m为指定的输出字段宽度,n为小数位数。如果数值长度小于m,左对齐,右补空格。
(8)e格式符,以指数形式输出实数,包括下面3种用法。
%e,输出6位小数和5位指数部分共占13位。
%m.ne,m为指定的输出字段宽度,n为小数位数。如果数值长度小于m,右对齐,左补空格。
%-m.ne,m为指定的输出字段宽度,n为小数位数。如果数值长度小于m,左对齐,右补空格。
(9)g格式符,根据数值大小自动选取f格式或e格式输出。
表3-2 printf格式符
格式符 | 说明 |
d | 以带符号的十进制形式输出整数 |
o | 以8进制无符号形式输出整数 |
x | 以16进制无符号形式输出整数 |
u | 以无符号10进制形式输出整数 |
c | 以字符形式输出,只输出一个字符 |
s | 输出字符串 |
f | 以小数形式输出单、双精度数 |
e | 以标准指数形式输出单、双精度数 |
g | 选用%f或%e格式中输出宽度较短的格式 |
表3-3 printf附加格式符
字符 | 说明 |
l | 用于长整型数,可加在格式符d、o、x、u前面 |
M(代表一个正整数) | 数据最小宽度 |
n(代表一个正整数) | 对实数,表示输出n位小数;对字符串,表示截断的字符个数 |
- | 输出的数字或字符左对齐 |
3.2.2 scanf函数
格式:scanf(格式控制,地址表列)
格式控制见表3-4和3-5。地址表列是由若干个地址组成的表列,可以是变量的地址或字符串的首地址。
表3-4 scanf格式符
表3-5 scanf附加格式符
格式控制见表3-4和3-5。地址表列是由若干个地址组成的表列,可以是变量的地址或字符串的首地址。
表3-4 scanf格式符
格式符 | 说明 |
d | 输入10进制整数 |
o | 输入8进制整数 |
x | 输入16进制整数 |
c | 输入单字符 |
s | 输入字符串 |
f | 输入实数 |
表3-5 scanf附加格式符
字符 | 说明 |
l | 用于输入长型数据以及双精度数据 |
h | 用于输入整型数据 |
m(代表一个正整数) | 指定输入数据所占宽度 |
* | 输入数据读入后不赋给相应的变量 |