1、数据输入与输出函数输出函数:Putchar(C)Printf(“ ”)输入函数Getchar()Scanf()putchar 函数的作用是向终端输出一个字符:例如 putchar(c) ;输出字符变量 c 的值。c 可以是字符型变量或整型变量。在使用标准 IO 库函数时,要用预编译命令“include ”将“stdio.h 文件包括到用户源文件中。即 include “stdio.h”。在需要使用标准 IO 库中的函数时,应在程序前使用上述预编译命令,但在用 printf 和scanf 函数时,则可以不要(只有 printf 和 scanf 例外) 。 例include “stdio.h”ma
2、in()char a,b,c;a=B;b=O;c=Y ;putchar(a ) ; putchar(n);putchar(b) ; putchar(c) ; printf 函数(格式输出函数)它的作用是向终端(或系统隐含指定的输出设备)输出若干个任意类型的数据(putchar 只能输出字符,而且只能是一个字符,而 printf 可以输出多个数据,且为任意类型) 。一、 printf 函数的一般格式为printf(格式控制,输出表列)“格式控制”是用双引号括起来的字符串,也称“转换控制字符串” ,它包括两种信息:1格式说明,由“” ,和格式字符组成,如d,f 等。它的作用是将输出的数据转换为指定
3、的格式输出。格式说明总是由“”字符开始的。2普通字符,即需要原样输出的字符。 “输出表列” 是需要输出的一些数据,可以是表达式。例如: printf (” a=d b=d” ,a,b); printf (” a+b=d ,a-b=”,a+b,a-b); 格式说明 输出表列 在上面双引号中的字符除了“d”以外,还有非格式说明的普通字符,它们按原样输出。如果a、b值分别为3、4,则输出为 a=3 b=4 二、格式字符 对不同类型的数据用不同的格式字符。有以下几种格式字符: 1d格式符。用来输出十进制整数。有以下几种用法: (1)d,按整型数据的实际长度输出(见上面)。 (2)md,m为指定的输出字
4、段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出,如 printf (“ 4d,4d” , a,b) 若a123,d=12345,则输出结果为: 123,12345 (3)ld,输出长整型数据。如 1ong a=135790; printf(” ld,a); 如果用d输出,就会发生错误,对1ong型数据应当用ld格式输出。对长整型数据也可以指定字段宽度,如将上面printf函数中的“ld” 改为“81d” 则输出为 135790 8列 一个int型数据可以用d或ld格式输出。 2. O格式符,以8进制数形式输出整数 。由于是将内存单元中的各位的值(0或1)按八进制形式
5、输出,因此输出的数值下带符号,即将符号位也一起作为八进制数的一部分输出。例如,-在内存单元中(以补码形式存放)如下: a=-1 11 11 11 11 11 11 11 11 int a-1 printf(” d,o” ,a,a); 输出为 1,177777 不会输出带负号的八进制整数。对长整数(1ong型)可以用“1o。”格式输出。同样可以指定字段宽度,如printf(”8o” ,a)输出数据为 177777。 3x格式符,以16进制数形式输出整数,同样不会出现负的十六进制数。例如: int a一1; printf(”x,0,d” ,a,a,a); 输出结果为 ffff,177777,-1
6、同样可以用“lx” 输出长整型数,也可以指定输出字段的宽度,如“12x” 4u格式符,用来输出unsigned型数据,即无符号数,以十进制形式输出。 一个有符号整数(int型)也可以用u格式输出;反之,一个 unsigned型数据也可以用d格式输出。按相互赋值的规则处理。unsigned型数据也可用o或x格式输出。unsigned int a=65535;int b=-2;printf(” a=%d,%o,%x,%un”,a,a,a,a);printf(”a=%d,%o,%x,%un”,b,b,b,b);运行结果为:a一1,177777,ffff65535 b一2177776,fffe,655
7、34 注意:1111111111111110 b=-21111111111111111 a=65535 5c格式符,用来输出一个字符。如: char ca; prinft(” c”,c); 输出字符a,请注意:“ c”中的c是格式符,逗号右边的 c是变量名,不要搞混。 一个整数,只要它的值在0255范围内,也可以用字符形式输出,在输出前,将该整数转换成相应的ASCII字符;反之,一个字符数据也可以用整数形式输出。 例33】 main ( ) char c=a; int i=97; printf(”c,dn”,c,c); printf(” c, dn”,i,i); 运行结果为: a,97 a,
8、97 也可以指定输出字数宽度,如果有 printf (”3c”,c) 则输出:” a”,即c 变量输出占 3列,前2列补空格。 6s格式符,用来输出一个字符串。有几种用法: (1)s, 例如 printf(”%s”,”CHINA”) 输出“CHINA”字符串(不包括双引号)。 (2)ms,输出的字符串占 m列,如字符串本身长度大于 m,则突破m的限制,将字符串全部输出。若串长小于m ,则左补空格。 (3)-ms,如果串长小于m ,则在m 列范围内,字符串向左靠,右补空格。 (4)m.ns,输出占 m列,但只取字符串中左端 n个字符。这n个字符输出在m列的右侧,左补空格。 (5)-m.ns,其中
9、m 、n含义同上,n个字符输出在m 列范围的左侧,右补空格。如果nm,则m自动取n值即保证n个字符正常输出。 main ( ) printf(”%3s,%7.2s,%.4s,%-5.3sn”,” CHINA”,”CHINA”,”CHINA”,”CHINA”); 输出如下:CHINA, CH,CHIN,CHI 其中第三个输出项,格式说明为“.4s”,即只指定了n, 没指定m,自动使mn=4,故占4列。 7f格式符,用来输出实数(包括单、双精度),以小数形式输出,有以下几种用法: (1)f,不指定字段宽度,由系统自动指定,使整数部分全部如数输出,并输出6位小数。应当注意,并非全部数字都是有效数字.
10、单精度实数的有效位数一般为7位。 【例】 main( ) float x,y; x111111111; y222222222; printf(” f,x十y); 运行结果为 333333328125 显然,只有前7位数字是有效数字。千万不要以为凡是打印出来的数字都是准确的。 双精度数也可用f格式输出,它的有效位数一般为 16位,给出小数6位。 例 main() double x,y; x=11111111111111111111; y2222222222222.22222222; printf(” f”, x十y); 输出结果为 3333333333333.328125 显然,双精度数也可用f
11、格式输出,它的有效位数一般为16位,给出小数位。 可以看到最后3位小数(超过16位)是无意义的。 (2)m.nf指定输出的数据共占m列,其中有n位小数。如果数值长度小于m,则左端补空格。 (3)一m.nf基本相同,只是使输出的数值向左端靠,右端补空格。 【例 main ( ) floatf f=123456; printf(”%f,%10f,%10.2f,%.2f,%-10.2fn”,f,f,f,f,f); 输出结果如下: 123.455994, 123.455994, 123.46, 123. 46,123.46 ,f的值应为123456,但输出为123455994,这是由于实数在内存中的存
12、储误差引起的 8.e格式符,以指数形式输出实数。可用以下形式: (1)e不指定输出数据所占的宽度和数字部分小数位数,由系统自动指定给出6(5)位小数,指数部分占5(4)位(如e+002,e+02),其中“e”占一位,指数符号占一位,指数占3(2)位。数值按标准化指数形式输出(即小数点前必须有而且只有一位非零数字)。例如 printf(”%e”,123.456); 输出:1.234560e002,(1.23456e+02)。也就是说用e格式输出的实数共占13(11)列宽度。 (2)m.ne和-m.ne m,n和“-”字符含义与前相同。此处n指数据的数字部分。若f123.456,则 printf(
13、”%e,%10e,%10.3e,%.3e,%-10.3e,”,f,f,f,f,f); 输出如下: 1.23456e+02,1.23456e+02, 1.23e02,1.23e 02,1.23e 十02 第二个输出项按10e输出,即只指定了m=10 ,未指定n,凡未指定n,自动使n=6,整个数据长11列,超过给定的10列,乃突破10列的限制,按实际长度输出。第三个数据共占10列,小数部分占2列。第四个数据按字“.2e”格式输出,只指定 n2,未指定m ,自动使m等于数据应占的长度,今为8列。第五个数据应占10列,数值只有8列,由于是“-10.2e”,数值向左靠,右补二个空格。 9g格式符,用来输
14、出实数,它根据数值的大小,自动选f格式或e格式(选择输出时占宽度较小的一种),且不输出无意义的零。例如,若:f=123.456,则 printf(”%f,%e,%g”,f,f,f); 输出如下: 123.456001,1.23456e+02,123.456 用f格式输出占10列,用 e格式输出占11列,用g 格式时,自动从上面两种格式中选择短者(今为f格式为短),故占 7列,且按%f 格式用小数形式输出,最后三个小数位“0”为无意义的0,不输出,g格式用得较少。 以上介绍了9种格式符,归纳如表 printt格式字符 格式字符 说 明 d 以带符号的十进制形式输出整数(正数不输出符号)。 o 以
15、8进制无符号形式输出整数(不输出前导符0)。 x 以16进制无符号形式输出整数(不输出前导符0x)。 u 以无符号10进制形式输出整数 c 以字符形式输出,只输出一个字符。 s 输出字符串。 f 以小数形式输出单、双精度数,隐含输出 6位小数。 e 以标准指数形式输出单、双精度数,数字部分小数位数为6位。 g 选用f或e格式中输出宽度较短的一种格式,不输出无意义的 0。 附加格式说明字符 字符 说 明 l用于长整型整型,可加在格式符 d o x.u前面。 m(代表一个正整数) 数据最小宽度。 .n(代表一个正整数)对实数,表示输出n位小数;对字符串,表示截取的字符个数。 - 输出的数字或字符在
16、域内向左靠。 用printf函数输出时,应注意数据类型应与上述格式说明匹配,否则将会出现错误。 在使用printf函数时,还有几点要说明: 1有些系统要求格式字符要用小写字母,如d不能写成D。 2. 可以在printf函数中的“格式控制” 字符串内包含第二章中的“转义字符” ,如“n”、“t”、“b”、“r”、“f”、“377”等。 3上面介绍的d,o,x,c,s,f,e,g 等字符,如用在“ ”后面就作为格式符号。一个格式说明以“”开头,以上述9个格式字符之一为结束,中间可以插入附加格式字符(也称修饰符)。例如: printf(“c=%cf=%fs=%s”,c,f,s); 第一个格式说明为”
17、c”而不包括其后的f,第二个格式说明为“f,不包括其后的s,第三个格式说明为s。其它的字符为原样输出的普通字符。 4如果想输出字符“” ,则应该在“ 格式控制”字符串中用连续两个表示,如 printf(” f”,103);输出0.333333 5不同的系统在实现格式输出时,输出结果可能会有一些小的差别,例如用e格式符输出实数时,有些系统输出的指数部分为4位(如e十02)而不是5位(e002),前面的数字部分为5位小数而不是6位等等。 数据输入 介绍两个输入函数,是以终端(或系统隐含指定的输入设备)为输入设备的。 3.5.1 getchar函数(字符输入函数) 此函数的作用是从终端(或系统隐含指
18、定的输入设备)输入一个字符, getchar函数没有参数,其一般形式为: getchar( ) 函数的值就是从输入设备得到的字符。例如: 例38 include “stdio.h” main ( ) char c: cgetchar(); putchar(c ); 在运行时,如果从键盘输入字符a; a (输入 a后,按“回车”键,字符才送到内存) a (输出变量c的值a) 请注意,getchar ( )只能接收一个字符。 getchar函数得到的字符可以赋给一个字符变量或整型变量,也可以下赋给任何变量,作为表达式的一部分。例如,例38第4、5行可以用下面一行代替。 putchar (getch
19、at(); 因为getchar ()的值为 a,因此输出a,也可以甩printf函数: printf (” c”,getchar (); 在一个函数中要用getchar函数,应该在函数的前面(或本文件开头)用 jnclude “stdio.h” 因为在使用标准i/o库中的函数时需要用到”stdio.h” 文件中包含的一些信息。 scanf函数(格式输入函数) getchar函数只能用来输入一个字符,用scanf 函数可以用来输入任何类型的多个数据。 一一般形式 scanf(格式控制,地址表列) “格式控制”的含义同printf函数,“地址表列”是由若干个地址组成的表列,可以是变量的地址,或字符
20、串的首地址。 例 main( ) int a,b,c; scanf(”%d%d%d”, 输入 123456 系统自动将123赋给a,456赋给b。也可用于字符型 scanf(” 3c”, 输入3个字符,把第一个字符赋给ch,例如输入abc ,ch得到字符a。 3后的“*”附加说明符,用来表示跳过它相应的数据。例如 scanf(” 2d*3d2dn”, 如果输入如下信息: 12 345 67 将12赋给a,67赋给b.第二个数据“345” 被跳过不赋给任何变量。在利用现成的一批数据时,有时不需要其中某些数据,可用此法“跳过”它们。 4。输入数据时不能规定精度,例如 scanf(”%7.2f”,
21、输入应用以下形式: 12:23:36 scanf(”a=%d,b=%d,c=%d”, 如输入 a b c 字符a送给c1 ,字符 送给c2,字符b 送给c3 ,因为c只要求读人一个字符,后面不需要用空格作为两个字符的间隔,因此 作为下一个字符送给c2 。 4在输入数据时,遇以下情况时该数据认为结束: 遇空格,或按“回车”或“ 跳格”(TAB)键。 遇宽度结束,如“3d”,只取3列。 遇非法输入。如 scanf(” dcf”,&a,&b,&c); 若输入: 1234al23o.26 第一个数据对应d格式输入1234之后遇字母a,因此认为数值1234后己没有数字了,第一个数据到此结束,把1234送给变量a,字符a送给变量b由于c只要求输入一个字符,因此a后面不需要空格,后面的数值应送给变量c,如果由于疏忽把本来应为123026错打成123o26,由于123后面出现字母o就认为此数值结束,将123送给人 c.