1、第2章 基本数据类型,基本数据类型的特征 数据常量 数据类型转换 数据的控制台输入与输出,C语言提供有丰富的数据类型:,2.1 基本数据类型的特征,C语言提供的基本数据类型包括char(字符)型、int(整)型、float(单精度实)型、double(双精度实)型。并且还可以通过使用short、long、signed和unsigned修饰char和int,用long修饰double,形成更多的类型。,2.1.1 数值的定点表示与浮点表示,定点表示和浮点表示,是C语言基本数据类型的重要特征。为了说明什么是“定点”,什么是“浮点”,先看值的几种表示形式: 日常的表示法 C语言中的表示形式3.141
2、59100 3.14159e00.314159101 0. 314159e+10.0314159102 0.0314159e+231.415910-1 31.4159e-13141.5910-3 3141.59e-3,浮点形式存储,2.1.2 整数的有符号类型与无符号类型,内存中的数值是以补码形式存放的,一个正数的补码就是该数的二进制数(如10的补码为00000000 00001010)。求一个负数的补码的方法如下:如-10的补码可以这样求: 先取该数的绝对值; 先取10 然后以二进制形式表示; 10的二进制码为 00000000 00001010 再对其取反; 取反得11111111 111
3、10101 然后加1; 加1,得 11111111 11110110,即-10的16位存储形式为:11111111 11110110。,2.1.3 类型宽度与取值范围,C语言对不同类型的数据分配不同宽度的存储空间,典型的存储空间宽度有:1个字节(8位)、2个字节(16位)、4个字节(32位)、8个字节(64位)和10个字节(80位)几种。显然,不同的长度,对应的数据的取值范围是不同的。当然,同样长度的取值范围还与有无符号、是定点表示(整型)还是浮点表示(实型)有关。另外还取决于所用的编译系统。大多数编译系统对一个带符号整数的数值范围处理为:-2n-1 2n-1-1。其中n为该整数所占的比特数。
4、如果一个整数所占的比特数为16,则该想整数的苑围为-32 767 32 767。也有一些编译系统对一个带符号整数的数值范围处理为:-(2n-1 1) 2n-1-1。如果一个整数所占的比特数为16,则该想整数的苑围为-32 768 32 768。,不同长度整型数据的取值范围,C语言中不同长度实型数据的取值范围和表数精度,C语言提供了一个测定某一种类型数据所占存储空间长度的运算符“sizeof”它的格式为:sizeof (类型标识符或数据)当不了解所使用的编译器中的某数据类型的宽度时,可以使用这个运算符计算之。,例2.1 用sizeof运算符测定所用的C系统中各种类型数据的长度。 /* 文件名:e
5、x020101.c */ /* 测定数据类型长度 */#include int main(void) int i = 0;printf (“char: %d bytes.n“,sizeof(char);printf (“short: %d bytes.n“,sizeof(short);printf (“i: %d bytesn“,sizeof (i); /* 计算变量i的字节数*/printf (“long: %d bytesn“,sizeof(long);printf (“float: %d bytesn“,sizeof(float);printf (“double: %d bytesn“,
6、sizeof(double);printf (“1.23456: %d bytesn“,sizeof(1.23456); /* 计算常量的字节数*/printf (“double: %d bytesn“,sizeof(double);return 0; ,用VC+6.0 编译并运行,得到以下结果: char: 1 bytes short: 2 bytes i: 4 bytes long: 4 bytes float: 4 bytes double: 8 bytes 1.23456: 8 bytes,2.2 数据常量,2.2.1 整型常量 整数常量的三种进制在C语言中,整型常量可以使用十进制数、
7、八进制数、十六进制数等几种形式书写。C语言规定,程序中 凡出现以数字0开头的数字序列,一律作为八进制数处理;凡出现以0x开头,后面跟若干位数字的,一律作为十六进制数处理;其它数字作为十进制数处理。,下面是合法的整型常量:,5121(十进制正整数) 0111(八进制正整数,等于十进制数73) 010007(八进制正整数,等于十进制数4103) 0177777(八进制正整数,等于十进制65537) 0XFFFF(十六进制正整数,等于十进制数65537) 0xA3(十六进制正整数,等于十进制数163) -32768(十进制负整数),下面不是合法的整型常量:,09876(非十进制数,又非八进制数,因为
8、有数字8和9)20fa(非十进制数,又非十六进制数,因为不是以0x开头)0x10fg(出现了非法字符),2. 整数常量类型的确定,在C语言中整数可以进一步分为short、int、long和long logn等类型。那么,对于一个常数如何分辨其类型呢?一般说来,有以下原则: 1)默认原则:在没有任何特别标志的情况下,可以按照常数所在的范围,决定其类型。例如,在16位的机器中,当一个常整数的值在十进制-3276832767(八进制数00177777、十六制数0x00xFFFF),则被看作一个short int或int型整数。超出上述范围的整常数,则被看作长整数(32位)表示。例如,234、3276
9、6、0177776、0xFFFE等被看作是int型,而-32769、32768、0200000、0x10000等被看作是long型。,2)后缀字母标识法: 用L或l表示long类型整数。用LL或ll表示long long类型整数。用U或u表示unsigned类型。,例如: -12L(十进制long整数) -12LL(十进制long long整数) 774545L(十进制long整数) 076L(八进制long整数,等于十进制数32768) 0100000L(八进制long整数,等于十进制62) 0x12l(十六进制long整数,等于十进制数18) 0X8000l(十六进制long整数,等于十进
10、制数32768) 12345u(十进制unsigned int类型) 12345UL(十进制unsigned long类型) 在16位字长的机器中,一旦把一个常数表示成long整数,系统便将其存储空间扩充为4个字节。从值的大小上看,12L与12没有区别,但它们占用的存储空间不相同,2.2.2 字符类型及其常量,1. 可打印字符字符类型的数据在内存中以相应的ASCII代码存放。例如,a的ASCII码为97,则在内存中的二进制存储形式为:01100001。,例2.2/* 文件名:ex020201.c */#include int main(void) char ch; /* 定义了一个字符类型的变
11、量ch */ch = a;printf (%d,ch); /* 使用整型格式码 */return 0; 运行结果为: 97,例2.3 /* 文件名:ex020301.c */#include int main(void) char ch;int i;ch = A;ch = ch + 32;i = ch;printf (%d is %cn,i,ch); /* 注意格式码 */printf(%c is %dn,ch,ch); /* 注意格式码 */return 0; 运行结果如下: 97 is a a is 97,例2.4 /* 文件名:ex020401.c */#include int main
12、(void) char c;c = 0362;printf (%dn, c);return 0; 运行结果: -14,2. 字符常量,ASCII字符分为可打印字符和不可打印字符两种。在C语言程序中,可打印字符常量是用一对单撇号括起来的一个字符,如a,A,?,。需要注意如下几点: 单撇号只是字符与其它部分的分隔符,或者说是字符常量的定界符,不是字符常量的一部分,当输出一个字符常量时不输出此撇号。 不能用双引号代替撇号,如a不是字符常量。 撇号中的字符不能是单撇号或反斜杠,如或不是合法的字符常量。,3. 转义字符,转义字符(反斜杠码)是C语言提供的处理一些特殊字符(包括一些不可打印字符)方法。重要
13、有如下一些: 用反斜杠开头后面跟一个字母代表一个控制字符(不可打印字符); 用代表字符“”,用代表撇号字符; 用后跟1到3个八进制数代表ASCII码为该八进制数的字符; 用x后跟1到2个十六进制数代表ASCII码为该十六进制数的字符。,转义字符表,例2.5 /* 文件名:ex020501.c */ /*打印人民币符号¥*/#include int main(void) printf(Yb=n);return 0; ,该程序运行时先打印一个字符“Y”。这时打印头已走到下一个位置,用控制代码b使打印头回退一格,即回到原先已打印好的Y位置再打印字符“=”,两字符重迭形成人民币符号“¥”。当然,这一输
14、出只能在打印机上实现,而不能在显示器上实现。因为显示器无此重迭显示功能(在显示后一字符时原在该位置上的字符消失)。转义字符除用来形成一个外设控制命令外,还用来输出不能直接从键盘上输入或不能用字符常量书写出的ASCII字符。这时要在反斜杠后跟一个代码值,这个代码值最多用三位八进制码数(不加前缀)或两位十六进制数(以x作前缀)表示。,例2.6/* 文件名:ex020601.c */ #include int main(void) char ch;ch=362;/*将八进制数362的ASCII字符赋给ch*/printf (%c,ch);return 0; 上运行可在显示屏上输出: ,4. 字符串常
15、数,在C语言中,把用一对双撇号括起来的零个或多个字符序列称为字符串常数。如:hello, Programming in C ,A , a , 等。字符串以双撇号为定界符,但双撇号并不属于字符串。要在字符串中插入撇号,应借助转义字符。例如要处理字符串I say: Goodby!时,可以把它写为I say: Goodby!字符串中的字符数称为该字符串的长度。字符串常数在机器内存储时,系统自动在字符串的末尾加一个“字符串结束标志”,它是转义字符“0”。如字符串“hello”在内存中存储为:,2.2.3 实型常量,C语言中的实型(浮点)数据常量用带小数点和小数分量的形式表示,如12.345,也可以用科
16、学记数法表示。C语言将实型数据分为:float、double和long double三种类型,并且默认的实型数据是double类型的。因此,对于带小数点的常量,C语言编译器会将之作为double类型看待。如果要特别说明某带小数点的常量是float类型或long double类型,可以使用后缀字母:用f或F表示float类型,如123.45f 1.2345e+2F.用l或L表示long double类型,如1234.5l 1.2345E+3L。使用科学记数法(指数形式)时,要求e的左边必须有数值部分(有效数字),可以是整数,也可以是小数形式;指数必须是整数形式。例如,e5、2e1.23、.e5等
17、都是不合法的。,2.2.4 符号常量,前面介绍的常量都是直接常量,从字面上即可直接看出它们的值是什么,因此又称“字面常量”。符号常量则是在一个程序(或程序的一部分)中指定的用名字代表的常量,从字面上不能直接看出其类型和值。例2.7 求圆面积和周长的两个程序。 程序1: /* 文件名:ex020701.c */ /* 计算圆的周长和面积 */ #include double calcuArea (double r); double calcuCircumference (double r);,2.2.4 符号常量,int main(void) printf (area=%f, calcuArea
18、 (2.0);printf (tcircumference=% fn, calcuCircum (2.0);return 0; double calcuArea(double r) /* 计算圆面积 */ return (3.141592654* r* r); double calcuCircum(double r) /* 计算圆周长 */ return (2.0* 3.141592654* r): 运行结果为: area = 12.566371 circumference = 12.566371,程序2: /* 文件名:ex020702.c */ /* 计算圆的周长和面积 */ #inclu
19、de define PI 3.141592654 /*定义符号常数*/ define R 2.0 double calcuArea(double r),; double calcuCircum(double r); int main(void) printf (area=%f, area (R);printf (tcircumference=%fn, circumference (R);return 0; double calcuArea(double r) return (PI* r* r) double calcuCircum(double r) return (2.0* PI* r);,
20、程序2的运行结果与程序1完全相同。程序2中PI代替3.141592654,用R代替20,使程序更容易理解,可读性好,而且当需要修改R的值时只需要改一处即可,方便又不易出错。定义符号常量的一种方法是使用define命令,它是一种“预编译命令”,在编译整个程序之前系统会先对程序中的预编译命令进行处理。上面define命令的作用是在预编译时将程序中凡出现PI的地方全部以3.141592654代替,凡出现R的地方一律以2.0代替。,2.3 数据类型转换,在下列情况下,C语言编译器,可能将数据从一种类型转换成另一种类型: (1)显式转换:使用转换表达式。 (2)隐式转换,包括:当二元运算符两端的操作数类
21、型不同时进行的转换;函数参数传递中的数据类型转换;函数返回时的数据类型转换;其他情形。,2.3.1 几个概念,数据类型的提升与降格提升可以分为如下3类情况: (1)类型提升:由整数转换为浮点数。 (2)整数提升:由短整数类型转换为长整数类型。 (3)同一长度的整数有符号与不有符号的,属于同一级别。,2. 符号位变为数据的最高位和最高位变成符号位,例2.8 分析下面程序的执行结果。 /* 文件名:ex020801.c */ #include int main(void) unsigned short us1 = 32767, us2 = 65535, us;signed short ss = -
22、7; us = ss;printf(“(1)ss = %d, us = %dn“,ss,us);ss = us1;printf(“(2)us1 = %d, ss = %dn“,us1,ss);ss = us2;printf(“(3)us2 = %d, ss = %dn“,us2,ss);return 0; ,程序执行结果如下: (1)ss = -7, us = 65529 (2)us1 = 32767, ss = 32767 (3)us2 = 65535, ss = -1,不同类型的变量之间通过赋值操作,使右值类型转换为左值类型。下面分2种情形讨论。,(1)第1种情形是把一个有符号的数-7(在
23、变量ss中),赋值给无符号类型的变量us后,存在无符号变量中的数据变成为65529了。这种变化是由于将原来的符号数中的符号变成了无符号数中的最高位而产生。如图2.4所示,当一个-7的16位补码被当作16位无符号数时,由于正数的原码=补码,所以1111 1111 1111 1001 = 65535(全1)-110=65529。,(2)第2种情形是将一个一般的unsigned类型数据转换成同长度的signed类型数据。在一般情况下,不会出现数据的错误。但是在第3种情形却出现了错误。这是因为当无符号数较小,其最高位为0时,转换成符号数后,最高位虽然被当作了符号位,但并没有影响数据的有效值。而如果无符
24、号数大到使最高位为1,则转换成有符号数后,被当成了负数的补码。于是,出现数据错误。,3. 截去小数与四舍五入,当一个实数(浮点数)转换为整数时,实数的小数部分全部舍去,并按整数形式存储。例如将实数3276.85赋给一个整型变量i,i的值为3276。但应注意,实数的整数部分不要超过整型数允许的最大范围(微机上为-3276832767),否则数据出错。当由double型转换为float型时,去掉多余的有效数字,但按四舍五入处理。,4. 丢失精度,四舍五入会丢失一些精度,截去小数也会丢失一些精度。此外,由long型转换成float或double型时,有可能在存储时不能准确地表示该长整数的有效数字,精
25、度也会受损失,因为float型只有7位精度。,5. 结果不确定与截去高位,浮点数降格时,即double转换为float,或double、float转换成long int、short型。当数据值超过了目标类型的取值范围时,所得到的结果将是不确定的(其实也是有规律的,只是给出一个用户往往难以理解的数值。例如,将实数32768.85赋给16位整型变量i,由于32768超过了16位整数最大值32767,在内存中就把32768存储为1000000000000000形式,它代表整数-32768。如果输出i,得-32768。若将32769.85赋给i,输出整数i的值得-32767。这些牵涉到补码的知识,在此
26、不详述)。当较长的整数转换为较短的整数时,要将高位截去。例如long型为4个字节,short型为2个字节,将long型值赋给short类型,只将低字节内容送过去。这就会有很大误差,得到的值是原数据值以32768为模的余数。,/* 文件名:ex020901.c */ #include int main(void) double a = 123456.789098765;float b;long c;short i,j;b = a; c = a; i = a; j = c;printf (a = %f, b = %f, c = %d, i = %d, j = %dn,a,b,c,i,j);retu
27、rn 0; 运行结果如下: a = 123456.789099, b = 123456.789063, c = 123456, i = -7616, j = -7616,2.3.2 数据类型的隐式转换,赋值转换 2. 一般表达式转换(1)一元转换,(2)二元转换按照优先级顺序将各二元运算符两端的操作数提升成同一类型。转换按照下面的算法进行。IF(一个操作数为long double) 另一个操作数转换为long doubleELSE IF(一个操作数为double) 另一个操作数转换为doubleELSE IF(一个操作数为float) 另一个操作数转换为floatELSE IF(一个操作数为u
28、nsigned long) 另一个操作数转换为unsigned longELSE IF(一个操作数为long) 另一个操作数转换为longELSE IF(一个操作数为unsigned) 另一个操作数转换为unsigned,3. 输出转换,例如,一个long型数在printf()中指定用%d格式输出,相当于先将long转换为int型后再输出。一个int型数也可按无符号方式输出(使用%u转换等)。,2.3.3 数据类型的显式转换,C语言提供一种“强制类型转换”运算符,将一个类型的变量强制转换为另一种类型。例如:(int)3.5中(int)的作用是将3.5转换成整型。,(类型标识符)表达式,例如:(
29、char) (3-3.14159 *x) (得到字符型数)k=(int)(int)x+(float)i+j) (得到整型数)(float)(x=99) (得到实型单精度数)C系统提供的数学函数中多数要求参数为double型,在调用这些函数时可以用显示转换方法进行类型转换。例如:double atan (double)i)double cos (double)i)double sqrt (double)i)double log (double)i)double exp (double)i),2.4 数据的控制台输入与输出,输入输出的对象是数据,而数据是以介质为载体的,因此进行输入输出操作就要与各
30、种外部设备发生联系,要指定从哪个设备(文件)读入数据,将数据输出到哪个设备(文件)上去。本节只讨论从终端(键盘)输入和输出到终端(显示器)的输入输出函数。通常也把这些函数称为控制台输入输出函数。主要是用得最广泛的scanf函数、printf函数、getchar函数和putchar函数等。其中scanf和printf用于格式化输入输出。,2.4.1 格式化输出函数printf(),1. printf()基本格式 printf()函数的一般形式如下:,int printf(格式控制字符串,输出表达式1,输出表达式2,);,2. 格式说明字段结构,(1)基本格式码,(2)长度修正符,(3)域宽与精度
31、说明,域宽与精度说明的格式为:m.n。其中:m为输出域宽,用字符数表示。对实数,包括了一个小数点的位置。n为精度,其用法有如下几种情形: 配合格式码f、e/E时,指定小数点后面的位数;未指定精度时,默认小数点后6位。 配合格式码g/G时,指定有效位的数目。 作用于字符串时,精度符限制最大域宽。 作用于整型数据时,指定必须显示的最小位数,不足时左恻补先导0。,/* 文件名:ex021001.c */ #include int main(void) printf(“%12.5fn”,123.1234567);printf(“%12fn”,123.1234567);printf(“%12.5gn”,
32、123.1234567);printf(“%5.10s%sn”,”abcdefghijklm”,”a”);printf(“%12.8dn”,12345);return 0; ,执行结果如图2.8所示。,(4)前缀修饰,例2.11 下面的对于数据定义: double x = 333.0123456789, y = -555.0123456789; int i = 123456;,例2.12 一个显示美国各州面积、森林覆盖面积和森林覆盖率的简单程序。 /* 文件名:ex021201.c */ /* 美国各州面积列表 */ #include int main(void) double ar ,por
33、,perc;printf(“%-12s%12s%12s%12sn“,“State“,“Area“,“Forest“,“Percent“);printf(“-n“);ar = 50750; por = 33945; perc = por/ar*100;printf(“%-12s%12.0f%12.0f%10.2f%n“,“Alabama“,ar,por, perc);ar = 591000;por = 201642; perc = por/ar*100;printf(“%-12s%12.0f%12.0f%10.2f%n“,“Alaska“,ar,por, perc);ar = 114000;po
34、r = 30287; perc = por/ar*100;printf(“%-12s%12.0f%12.0f%10.2f%n“,“Arlzona“,ar,por, perc);ar = 53187;por = 26542; perc = por/ar*100;printf(“%-12s%12.0f%12.0f%10.2f%n“,“Arkanasas“,ar,por, perc);ar = 158706;por = 61532; perc = por/ar*100;printf(“%-12s%12.0f%12.0f%10.2f%n“,“California“,ar,por, perc);ar =
35、 104000;por = 33340; perc = por/ar*100;printf(“%-12s%12.0f%12.0f%10.2f%n“,“Colorado“,ar,por, perc);printf(“n”);return 0; ,程序执行结果如下:,3. printf()中输出表达式的运算顺序,/* 文件名:ex021301.c */ #include int main(void) int a= 1, b = 2; printf(“ x = %d , y = %dn“,+ a + b,+ b + a);return 0; 程序执行结果如下: x = 5, y = 4,2.4.2
36、格式化输入函数scanf(),scanf()函数的功能是将输入数据送入相应的存储单元。具体地说,它是按格式参数的要求,从终端上把数据传送到地址参数所指定的内存空间中。其原型为:,int scanf (格式控制字符串,地址1,地址2,);,地址参数C语言允许程序员间接地使用内存地址,这个地址是通过对变量名“求地址”运算得到的。求地址的运算符为&a给出的是变量a两字节空间的首地址,&b给出的是变量b四字节空间的首地址。,2. 格式说明字段scanf()与printf()有相似之处,也有不同之处。scanf()格式控制字符串中的主要成分是格式说明字段和数据项。scanf()的格式说明字段的结构如图2
37、.9所示。,/* 文件名:ex021401.c */ #include int main(void) double a,b,c,d;scanf(“%f%f“, ,某次执行结果如下:,3. 数值数据流的分隔,scanf()是从输入数值数据流中接收非空的字符,再转换成格式项描述的格式,传送到与格式项对应的地址中去。当操作者在终端上键入一串字符时,系统怎么知道哪几个字符算作一个数据项呢?有以下几种方法:(1)使用默认分隔符:空格、跳格符(t)、换行符(n)。,/* 文件名:ex021501.c */ #include int main(void) int a;float b,c;scanf (%d%
38、f%f, ,一次运行情况如下: 12 345 6789 87654321 a=12,b=345.000000,c=6789.000000注意,当从键盘上键入一串字符流后,只有键入回车时,系统才开始执行执行scanf()规定的操作。,(2)根据格式项中指定的域宽分隔出数据项。,/* 文件名:ex021601.c */ #include int main(void) int a;float b,c;scanf (%2d%3f%4f, 一次运行情况如下: 12345678987654321 a=12,b=345.000000,c=6789.000000,(3)根据格式字符的含义从输入流中取得数据,当
39、输入流中数据类型与格式字符要求不符时,就认为这一数据项结束。#include int main(void) int a;char b;float c;printf (input a,b,c:n);scanf (%d%c%f, 一次执行结果为: input a b c: 1234r1234.567(带下划线者为输入流) a=1234,b=r,c=1234.567017,(4)格式控制字符串中的非空白字符在scanf()中的格式控制字符串中,除了格式说明字段中的字符外,所出现的其他字符,都必须在输入数据流时照样输入。 例2.18 /* 文件名:ex021801.c */ #include int
40、main(void) int a, b ; scanf(“input:%d$%d“, 输入的情形如下: input:123$456 123,456,4. scnaf()与输入缓冲区,在输入数据时,实际上并不是输入完一个数据项就被读入送给一个变量,而是在键入一行字符并按回车键之后才被输入,这一行字符先放在一个缓冲区中,然后按scanf()格式说明的要求从缓冲区中读数据。如果输入的数据多于一个scanf()所要求的个数,余下的数据可以为下一个scanf()接着使用。,#include int main(void) int a,b,c,d,e,f;scanf(%d %d, 运行情况如下: 13 24
41、 35 46 57 68 79 a=13,b=24,c=35,d=46,e=57,f=68,这个程序中的操作图,5. scanf()用于字符输入,(1)所有空白字符、转义字符都将作为有效字符被接收,因此不能再使用空白或其他字符进行数据项的分隔。(2)当定义有字段宽度时,scanf()将在缓冲区中的输入流上,按宽度间隔地跳取字符。,6. scanf()的停止与返回,scanf()函数操作有四个作用: (1)首先从缓冲区中提取需要的数据。 (2)如果缓冲区中没有需要的数据,则要求从键盘输入一个数据流。输入操作以回车操作结束。 (3)遇到下面的情形终止执行:格式参数中的格式项用完正常结束;发生格式项
42、与输入域不匹配时非正常结束。例如从键盘输入的数据数目不足。 (4)执行成功,返回成功匹配的项数,执行失败,返回0。,2.4.3 字符输入输出函数getchar()与putchar(),为了方便字符的输入输出,标准C还提供了两个简单的库函数:getchar()和putchar()。它们的原型分别为:,int getchar(void); int putchar(int c);,getchar()被执行后,就等待击键操作,然后从返回一个字符值,并自动把击键结果回显在屏幕上。它虽然被定义为返回int类型,但由于所读取的字符被保存在低字节中,所以可以赋值给一个char型变量。读取失败,返回-1。put
43、char(c)函数是将字符变量c中的字符输出到标准输出设备(一般也是用户终端)上。,/* 文件名:ex022401.c */ #include int main(void) char ch1,ch2,ch3; ch1=getchar();ch2=getchar(); ch3=getchar();putchar (ch1); putchar (ch2);putchar (ch3); putchar (n);return 0; ,注意:在执行getchar()时,虽然是读入一个字符,就回显一个字符,但并不是从键盘按一个字符,该字符就被立即送给一字符变量,而是等到一个回车键后,才将一行字符输入缓冲区,然后getchar函数从缓冲区中取一个字符给一个字符变量。这种情况称为行缓冲。getchar()的行缓冲(等回车)和回显也会为某些交互性应用带来不便。这时,可以用下面的两个库函数代替:getche():读字符,并回显,不等回车;getch():读字符,但不回显,不等回车。 不过,这两个库函数在ANSI C标准中并没有定义,是一种常见扩充。对于多数C编译器,这两个函数的原型被定义在头文件中。在有的编译器(如Visual C+)中,它们可能被冠以下划线前缀:_getche()和_getch()。,