第一章C十十概述 21 读者就能明了在输出语句中必须正确地设置变量类型,才能得到自己所需的输出结果 注:当输出流语句向终端上写控制特时,做为ASC宇符显示,则会产生某些奇异(无 害)的结果。例如,修改后的DT程序可能会显示拉圾字符,发事嘟声,或清除屏幕 1.3.2传统风格输出 读C程序时,常常要运行如下的语句: printf("Enter your name:"); printf("Your balance is %d\n",balane): 这相当于C+十的输出流语句。函数printf把圆括号中的自变量转换为标准的输出,第 一个语句是一个简单的字符串,第二个语句也是二个字符串,用了一个特定的符号(%)在 引号之间的字符中加了一些项。在第二句中,该项是一个名为balance的变量,printf将 balance转换为字符串,并插人到%d的位置。该程序运行结果如下: Your balance is $75.68 注:为在C十十程序中使用printf,在程序的开始处插入#include<stdio.h>。然而,由 于输出流可以完成pinf所做的任何并且更多,因此最好选用输出流语句。另外,输 出流语句编译后的程序通常比调用printf函数的程序效率更高。 1.3.3格式化输出 使用简单的输出流语句,并不总能满足输出需求。例如,可用以下语句以十进制方式显 示整数count的值: count <<The count is <<count 但若要以十六进制或八进制方式显式count的值,就要使用格式输出函数oct,dec和 hex,它们能把int或log变量转换成八进制、十进制或十六进制。以下的例子说明如何使用 这些函数: cout<<"The octal count is #<oct(count): cout<<The decimal count is<<dec(count) cout<<The hexadecimal count is<<hex(count) 各行结尾处的函数将cou的值转换为字符串,然后输出流语句显示该字符串。 另外使用格式化函数还可将显示结果的列数居中或对齐。例如可在调用格式化输出函 数时规定显示字符的最小数目: cout<<“”<<de(count,lo) 这条语句显示count的值前加人空格使之一共达到1D个字符。如果count的值大于显 示列数输出流语句也能正常显示,但只是没有预计的右对齐效果了。 程序清单1.8(JUSTIFY.CPP)说明了对整数变量如何使用三种格式化输出函数(oc, hex和dec)以及对char和string型变量如何使用的格式化输出函数chr和str
22 C十十实用棒制教灌 程序清单L.8 JUSTIFY.CPP 1:/justify.cpp-Justifying characters and strings 2: 3:#include <stream.hpp> char *cutline-\n -Vn": main() 8, 9: int value =249; char c ='X'; chars-IBrake for Butterflies" 3 cout <cutline<<"Left justified:"<<cutline 14, cout <value 15: cout <hex(value)<<n' 16, cout <oct(value) <<n' 1 couf 19 cout cout <cutline <<"Right justified:"<<cutline 21: cout <<dec(value,30)<<n'; 22: cout <hex(value,30)<<n' cout oct(value ,30)<<n c30 26, 在9-11行中,定义并赋值了一个整数,一个字符和一个字符串.第11行产生了一个名 为S的指针,它指向以双引号定界的字符串的第一个字符(指针将在第四章中加以说明)。 l3一18行的输出流语句给出了以缺省方式使用hex和oct将Vaue转换为十六进制和八进 制。这里无须使用格式化函数dec,chr和str,因为这些格式就是整数,字符和字符串的值的 缺省方式。20一25行将同样的变量以30列显示。这些语句与13一18行的不同之处在于规 定了列宽(30),并使用了dec,chr和str函数。 对于更复杂的格式输出,还可以在输出流语句中使用fom函数,但它是C十十库中最 复杂的函数之一,要用较多篇幅才能说明它的用法及功能。程序清单1.9给出了使用Fom 函数的例子,详细说明参见第十章关于如何使用fom格式化输出的内容。 程序清单1.9 FORMAT.CPP 1:format.cpp-Demonstrate formatted output 2: 3:#include <stream.hpp> int value 0x79AF 8 long longValue -123456789 9 double pi=3.14159;
第一幸C十十瓶注 23 12 13: cout<<form("Plain decimal =%d\n",value) 14: cout<form("Signed decimal =%+d八n",value) 15: cout<<form(Right justified =%10d\n",value) 16: 194 cout<<form("Up 20. 21: cout <form("\nBinary =%bn",value); 22: 231 cout<<form("\nUnsigned long decimal -%d\n",longValue); out<<form("Signed long decimal %Ld\n",long Value) 26: cout <form("\nFloating =%f\n",pi) 271 =en,p) 28 cout<<form("Default notation =%gn",pi): : cout<<form("FP precision 10 =%.10fn",pi): 30 32 cout<<form(n%s's balance-$%8.2f",name.balance) 和本章中的其他程序一样,FORMAT开始在7-11行定义了几个测试值.13一15行用 输出流语句和form显示了整型变量Value,显示结果如下: 1 Right justified 31151 注意,在13行中,字符串里的百分号符告诉Fam函数在这里插人一个值。百分号(%) 称之为脱离字符,它使得C+十暂时离开正常处理,而去处理下面的字符。百分号的表明 需要在这里以十进制显示一个整数,这里整数Value必需在格式化串之后,并用分隔符逗号 分开。 第14行语句中的%+d说明需要显示一个有符号整数,form将根据数的正负在显示时 在数的前面加上“+”号或“一”号。 第15行语句中的%10d的作用与前面讲过的函数dcc作用类似。10告诉fom以后对 齐、最少10字符的方式显示十进制数。读者对照一下显示结果即可明了。 第17一l9行用格式化指令%x,%#x和%#X显示value。.首先是用十六进制显示,接 着在前面加上0x显示十六进制,即C十十中十六进制的标准表达式。第三种方式与第二种 类似,不同之处是以大写方式。屏幕上的显示结果如下: Plain hexadecimal =70af Prefaced hexadecimal -0x79af Uppercase hexadecimal=0x79AF 除了十进制与十六进制格式外,fom还能根据%b以二进制方式显示。第21行的显示 结果如下:
24 C十十宾用情剂教粒 Bnay-111100110101111 用指令%1或%L能显示长十进制数(在本书中,C++里的长十进制数占32-bit).%1d 是以无符号方式显示,%L是以有符号方式显示,第23一24行使用了这些指令来显示其结 果如下: Unsigned long decimal 123456789 Signed long decimal =-13035 om函数还能以多种方式显示浮点数。例如,用表达式(%)以标准十进制方式显示, 用(%)以科学方式显示,以及用表达式(%g)以根据数的大小或以标准十进制、以科学方式 显示。在显示时还可定义不同的显示精度,这只须在百分号后加小数点后再加上要显示的精 度数即可。例如指令$%10叶表明以十进制,小数点后10位数字有效方式显示浮点数。下 面给出第26一29行中用浮点指令产生的显示结果: Floating point -3.141590 Scientific notation =3.141590e十000 Default notation =3.14159 FP precision 10 3.1415900000 第31行的语句说明了输出流语句中Fom函数的典型用法,将多个值插人在一个字符 串中显示。语句: form("n%s's balance=$%8.2f",name,balance)i 在起始的双引号之后,n表示从新的下一行显示指令%s是让form在这里插人一个字 符串。经过其他一些字符之后,第2个指令%8.2f是让form在这里以8个字符小数点后两 位有效数字显示一个浮点数。运行这条语句后的显示结果如下: Judy's balance=$572.63 注意,在第3l行中form里定义了三个变量:格式化串,name和balance值.这两个值是 通过格式化串中的格式化指令%s和%8.2f加以说明的。在使用fom时,格式化指令的个 数与值的个数必须一样多,另外,在form中的串里,指令和值的个数是没有限制的 注:om离数的使用方法与C和C十十中printf的用法一样,唯一区别在于,在输出流 语句中只能用form,而不能用printf。 1.3.4输入流 ,到目前为止,我们给出的程序都是输出信息,即显示。现在我们考虑问题的另一面在程 序里怎样从外部得到信息。外部,我们目前主要是指键盘,但有时我们也会说明如何从其他 方面得到信息。接收键盘信息的最简单方式是利用输出流语句。例如,下面的语句提示并读 整数的值到定义为int countDown的变量中: cout<Start countdown from? in>>countdown 第一条语句使用输出流语句显示一行提示。第二条语句使用输人流语句读人一个值到 变量countdown中。在第二条语句中cin表示输人入源,即标准字符输人键盘。符号>>表示 流的流向,它表明信息流是由左向右,由源(cin)到它的目的(coundown)
第一幸C十十概述 不难发现,输人流与输出流是类似的,它们只是使用了不同的流对象(cin代替了cout), 以及与输出流从右到左(<<)不同,输人流是从左到右(>>) 虽然较为常见的是在输人流语句中每次读人一个变量,但也和输出流语句一次显示多 个值一样,可以一次读入多个变量。例如,若要输出V1和V2的值,读者可编写如下语句: cout <form("v1-%d v2-%d n",v1.v2); 第1行提示输出两个值。第2行从cm中将这两个值读入到VI和V2中。第3行是用 输出流语句及fom函数显示所输人的值。因为要在输人流语句中一同读人两个值,所以程 序运行时在两个值中间要有 一个空格符或键入一次<Enter>键。如果读者愿意选择每次 输入一个值可采用下列语句: cout<<"Enter vl: ein>>w】: ccut <<"Enter v2"; v2=%dn',v1,v2) 1.3.5传统方式输入 在C语言中是采用scanf函数做输入,如同printf一样,C+十中也能用这个函数。因为 输入流语句能完成scanf的所有功能,所以C十十中很少使用scand函数。因此,这里我们就 不再介绍这个函数了(在第十章中我们介绍如何使用这个函数)。 1.3.6格式化输入 当读者用输入流语句读取数值时,一个很重要的问题是:当用户输人非数值型字符时如 何处理。为了说明这个问题请编译并运行程序清单1.10(NUMIN.CPP). 程序清单1.10 NUMIN.CPP 1:/numin.cpp-Simple way to input numbers include <stream.hpp 5:main() 6, 7 double fp: ∥A floating point value 8: longK: ∥A long int value <"Enter a floating point value:" 12 cout <"Value entered is<<fp<<n' 13 14 cout<"Enter an integer value:" 15: cin >ki cout<<Value entered is<<k<<