第4章键盘输入和屏幕输出§4.1单个字符的输入和输出§4.2数据的格式化屏幕输出§4.3数据的格式化屏幕输入§4.4本章扩充内容§4.5小结§4.6单个字符的输入和输出数据输入输出的概念及在C语言中的实现从计算机向外部输出设备输出数据叫“输出”,反之称为“输入”。C语言本身不提供输入输出语句,输入和输出操作是由函数来实现的。在C标准函数库中提供了一些输入输出函数,例,printf和scanf函数。注意它们不是C语言的关键字,而只是函数的名字。实际上用户完全可以不用printf和scanf这两个名字,而另外编两个输入输出函数,用其他的函数名。C提供的函数以库的形式存放在系统中,它们不是C语言文本中的组成部分。有关C语言的函数库由于C编译系统与C函数库是分别进行设计的,因此不同的计算机系统所提供函数的数量、名字和功能不尽相同。但一些通用函数(如printf、scanf等),也称为标准函数,各种计算机系统都提供。在使用C语言库函数时,要用预编译命令“#include”将有关“头文件”包括到用户源文件中。在头文件中包含了与用到的函数有关的信息。例如使用标准输入输出库函数时,要用到“stdio.h”文件。#include命令都是放在程序的开头,因此这类文件被叫作“头文件”。在调用标准输入输出库函数时,文件开头应有#includestdio.h或#include“stdio.h”§4.1单个字符的输入和输出有关字符常量的概念前面已经介绍过:用单引号引起来的一个字符。例如:‘a’是字符常量,而a则表示是一个标识符;‘3’是字符常量,而3是一个整常量。另外,C语言还引入了一种特殊字符常量“转义字符”,参见教材P44页《表4-1常用的转义字符》。§4.1.1字符常量§4.1.2字符的输入/输出stdio.h是standardinput&output的缩写,它包含了与标准I/O库有关的变量定义和宏定义。由于考虑到printf和scanf函数使用频繁,系统允许在使用这两个函数时可不加#include命令。在这一节中介绍C标准I/O函数库中最简单的、也是最容易理解的字符输入输出函数putchar()和getchar(),然后再介绍格式输入输出函数printf()和scanf()。putchar函数(字符输出函数)putchar函数的作用是向终端输出一个字符:例如:putchar(ch);表示输出字符变量ch的值。ch可以是字符型变量或整型变量。例4-1输出单个字符。源程序文件名称为:text1.c#includestdio.hintmain(void){chara,b,c;a=‘B’;b=‘O’;c=‘Y’;putchar(a);putchar(b);putchar(c);return0;}注意程序格式的规范化:⑴预处理部分和主函数间空行。⑵主函数书写的固定格式①声明部分和执行部分间空行。②花括号({})单独占一行。③逗号后应空格。④运算符两侧应空格。⑤程序的最后用return结束。⑶其它的规范逐步介绍。若要输出形式改为:BOY怎么修改程序?getchar函数(字符输入函数)此函数的作用是:从终端(或系统隐含指定的输入输出设备)输入一个字符。getchar函数没有参数,其一般形式为getchar()函数的值就是从输入设备得到的字符。例4-2输入单个字符。源程序文件名称为:text2.c在运行时,如果从键盘输入字符‘a’并按回车键,就会在屏幕上看到输出的字符‘a’。(输入‘a’后,按“回车”键,字符才送到内存)(输出变量c的值‘a’)#includestdio.hintmain(void){charc;c=getchar();putchar(c);return0;}aa注意:getchar()只能接收一个字符。getchar函数得到的字符可以赋给一个字符变量或整型变量,也可以不赋给任何变量,作为表达式的一部分。例如:c=getchar();putchar(c);以上两句可用:putchar(getchar());代替。因为getchar()的值为‘a’,因此putchar函数输出‘a’。也可以用printf函数输出:printf(“%c”,getchar());在一个函数中(如main函数)要调用getchar()函数,应该在该函数的前面(或文件开头)加上“包含命令”#includestdio.h§4.2格式输入与输出printf函数scanf函数1、printf函数(格式输出函数)printf函数前已用过它,其作用是向终端输出若干个任意类型的数据。(注意:putchar只能输出字符,而且只能是一个字符,而printf可以输出多个数据,且为任意类型)printf函数的一般格式为printf(格式控制,输出表列)例如:printf(“%d,%c\n”,i,c)下面分别介绍和格式控制输出表列(1)格式控制格式控制是用双引号括的字符串,出叫做“转换控制字符串”,它包括两种信息:①格式说明,由“%”和格式字符组成,如%d,%f等。它的作用是将输出的数据转换为指定的格式输出。格式说明总是由“%”字符开始的。②普通字符,也叫做字符串原样输出。例如:printf(“%d,%c\n”,i,c)其中双引号内的逗号和换行符。(2)输出表列“输出表列”是指需要输出的一些数据,可以是表达式。例如:设a值为5,b值为8printf(“%d%d”,a,b);格式说明输出表列printf(“a=%db=%c”,a,b);字符串原样输出输出表列在上面双引号中除了“%d”和“%c”以外,还有非格式说明的普通字符,它们按原样输出。输出形式为:58输出形式为:a=5b=8在输入数据时,遇以下情况时该数据认为结束。①遇空格,或按“回车”或“tab键”。②按指定宽度结束,如“%3d”,就只能输入3列。③遇非法输入。C语言的格式输入输出的比较繁琐,用得不对就得不到预期的结果,而输入输出又是最基本的操作,几乎每个程序都包含输入输出,因此要求大家熟练掌握。2.格式字符对不同类型的数据用不同的格式字符。常用的有如下几种:(1)d格式(2)c格式(3)s格式(4)f格式(5)e格式(6)g格式(1)d格式符其作用是用来输出十进制整数。有如下几种用法:①%d按整型数据的实际长度输出。②%md,m为指定的输出字段的宽度,如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。如:printf(“%4d,%4d”,a,b);若a=123,b=12345。则输出结果为:123,12345③%ld,输出长整型。如longa=123456;printf(“%d”,a);(应该用printf(“%ld”,a);)如果用%d输出,就会发生错误,因为整型数据的范围为-32768~32767。对long型数据应当用%ld格式输出。对长整型数据也可以指定字段宽度如将上面改为printf(“%8ld”,a);则输出为:1234568列一个int型数据可以用%d或%ld格式输出。(2)c格式它的作用是用来输出一个字符。例如:charx=‘a’;printf(“%c”,x);一个整数,只要它的值在0~255范围内,也可以用字符形式输出,在输出前,系统会将该整数作为ASCII码转换成相应的字符,反之,一个字符数据也可以用整数形式输出。例4-3字符数据的输出源程序文件名称为:text3.c#includestdio.hintmain(void){charc=‘a’;inti=97;printf(“%c,%d\n”,c,c);printf(“%c,%d\n”,i,i);return0;}注:双引号中的逗号后不需空格。同样它也可以指定输出字数宽度,例如:printf(“%3c”,c);输出形式为:a(c变量占3列)。#includestdio.hintmain(void){charc=‘a’;inti=97;printf(“%3c,%d\n”,c,c);printf(“%c,%d\n”,i,i);return0;}注意比较上下两条输出语句的不同之处。(3)s格式它的作用是用来输出一个字符串,有如下几用法:①%s例如:printf(“%s”,“CHINA”)输出“CHINA”字符串(不包含双引号)。②%ms,输出的字符串占m列,如字符串本身长度大于m,则突破m的限制,将字符串全部输出。若串长小于m,则左补空格。③%-ms,如果串长小于m,则在m列范围内,字符串向左靠齐,右补空格。④%m.ns,输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格。⑤%-m.ns,其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。如果nm,则m自动取n值,即保证n个字符正常输出(4)f格式符%f格式符,用来输出实数(单、双精度),以小数形式输出。①%f不指定字段宽度,由系统自动指定,使整数部分全部如数输出,并输出6位小数。②%m.nf指定输出的数据共占m列,其中有n位小数,若数值长度小于m,则左端补空格。③%-m.nf与%m.nf基本相同,只是使输出的数值向左端靠,右端补空格。例题:4-4#includestdio.hintmain(void){floatx,y;x=111111.111;y=222222.222;printf(“%f”,x+y);return0;}运行结果为:333333.328125注意:由于单精度实数的有效位数一般为7位,所以只有前7位数字是有效。例题:4-5输出双精度数时的有效位数输出结果为:3333333333333.333010同样可看出,超过16位的数是无意义的。#includestdio.hintmain(void){floatx,y;x=1111111111111.111;y=2222222222222.222;printf(“%f”,x+y);return0;}例题:4-6输出实数时指定小数位数。intmain(void){floatf=123.456;printf(“%f%10f%10.2f\n”,f,f,f);printf(“%0.2f%-10.2f”,f,f);return0;}输出结果为:123.456001123.456001123.46123.46123.46(5)e格式符作用是以指数形式输出实数。①%e不指定输出数据所占的宽度和数字部分小数位数,由系统自动指定给出6位小数指数部分占5位(如e+002),其中“e”占1位,指数符号占1位,指数占3位。数值按规范化指数形式输出(即小数点前必须有而且只有1位非零数字)。②%m.ne和%-m.ne。m、n和“-”字符含义与前面相同。此处n指拟输出的数据的小数部分(又叫尾数)的小数位数。e格式符输出示例printf(“%e”,123.456);输出结果如下:1.234560e+002说明%e格式输出的实数共占13列。printf(“%e%10e%10.2e\n”,f,f,f);printf(“%.2e%-10.2e”,f,f);输出结果如下:1.234560+0021.234560e+0021.23e+00213列13列10列1.23e+0021.23e+0029列10列第2个输出项%10e输出,即只指定了m=10,未指定n,凡未指定n,自动使n=6,整个数据长13列,超过给定的10列,乃突破10列的限制,按实际长度输出。第3个数据共占10列,小数部分占2列,第4个数据按“%.2e”格式输出,只指定n=2,未指定m,自动使m等于数据应占的长度,今为9列。第5个数据应占10列,数值只有9列,由于是“%-10.2e”,数值向左靠,右补一个空格。(5)g格式符作用:用来输出实数,它根据数值的大小,自动选f或e格式(选择输出时占宽度较小的一种),且不输出无意义的零。例如:f=123.456printf(“%f%e%g”,f,f,f);输出结果如下:123.4560001.23