C语言程序设计---第3章1第3章标准输入与输出3.1概述3.2字符输入输出函数3.3格式化输入和输出函数3.4输入和输出函数的讨论C语言程序设计---第3章2通过终端输入(如键盘、鼠标等),也称为标准输入(standardinput),直接向终端输出(如显示器、打印机等),也称为标准输出(standardoutput)。3.1概述C语言本身没有提供输入输出语句,C语言中的所有I/O操作都是通过函数调用来实现,而这些并非C语言一部分的输入输出函数均以目标级程序的方式提供,并存放在一个C标准函数库中。每一个标准库都有一个相应的头文件,该头文件包含了该库中所有函数的函数原型及其相关信息。在调用这些库函数时,要用预处理命令“#include”将有关的“头文件”包括到用户源程序中。标准输入输出库函数对应的头文件是“stdio.h”。stdio是standardinput&output的缩写。因此,读者在调用标准输入输出库函数时,你的源程序开头应该有如下编译预处理命令:#includestdio.h或#includestdio.hC语言程序设计---第3章33.2字符输入输出函数3.2.1字符输出函数putchar()putchar()函数是向屏幕一个字符,其调用格式为:putchar(ch);其中ch为一个字符变量、字符常量或整型常量。/*本程序测试多种类型数据作putchar()函数参数的输出情况*/#includestdio.hmain(){charc=’A’;/*定义字符变量并初始化*/putchar(c);/*输出变量C的值即字符A*/putchar(’A’);/*输出字符A*/putchar(’\x41’);/*输出字符A,它以转义字符表示,十六进制*/putchar(0x41);/*直接用ASCII码值输出字符A*/putchar(’\101’);/*输出字符A,它以转义字符表示,八进制*/}C语言程序设计---第3章43.2.2带缓冲区的字符输入函数getchar()getchar()函数的功能是从标准输入文件(通常是键盘,亦指磁盘文件)读取一字节代码(即一个字符),并回显。所谓回显,是指输入一个字符的同时又在屏幕上显示出该字符。这是标准C提供的字符输入函数,因此也是最常用的字符输入(尤其是键盘输入)函数。键盘缓冲区(实际上应该称作输入流即stdin流)。所谓键盘缓冲区,是指在内存开辟的一片临时单元,用来暂时存放从键盘输入的字符。getchar()函数是带键盘缓冲区的输入函数,是指当从键盘输入字符时,这些字符先存放在键盘缓冲区,如果不敲回车键,getchar()函数并没有真正被执行(即所谓被激活);仅当回车键也被送入键盘缓冲区后,getchar()函数才从键盘缓冲区中读取一个字符。C语言程序设计---第3章5强调以下三点:(1)调用getchar()函数输入字符时,必须用另一个变量(字符变量或整型变量)接收输入的字符。例如:ch=getchar();(2)调用getchar()函数输入字符时,仅当敲入回车键后,函数才被激活。(3)调用该函数时,输入的每一个字符,包括空白符(即空格、制表符和回车符),都被送存到键盘缓冲区。C语言程序设计---第3章6/*本程序调用getchar()函数输入一个字符*/#includestdio.hmain(){charc;/*定义字符变量*/c=getchar();/*接收键盘输入的一个字符*/putchar(c);/*输出该字符*/putchar(’\n’);}C语言程序设计---第3章73.2.3不带缓冲区的字符输入函数getch()和getche()这是某些编译器,譬如TurboC新增加的两个字符输入函数,这两个函数都是从键盘上读入一个字符。两者的区别是:getch()函数将读入的字符不回显在屏幕上,而getche()函数却将读入的字符回显到显示屏幕上。C语言程序设计---第3章8/*本程序调用getchar()函数输入一个字符*/#includestdio.hmain(){charc,ch;c=getch();/*从键盘上读一字符不回显送给变量c*/putchar(c);/*输出该字符*/ch=getche();/*从键盘读一字符送给变量ch并回显*/putchar(ch);/*输出该字符*/}C语言程序设计---第3章93.3格式化输入和输出函数3.3.1printf()函数用于按指定格式向标准输出设备(屏幕)输出。有两种形式:printf(字符串);例如,下面的语句:printf(Howareyou!\n);是在屏幕上输出这样一行:Howareyou!这种形式的输出并没有指定输出格式。C语言程序设计---第3章10另一种形式是:printf(格式控制串,参数表)“格式控制串”是由0个或多个格式转换说明组成的一个字符串序列。格式转换说明的一般形式为:%[flag][[width][.prec]][[h][l][L]]输出格式符格式修饰符(见表3-2)见表3-1printf(“%d”,a);printf(%d%f,a,x);printf(a=%d,b=%d,a+b=%d\n,a,b,a+b);printf(“a=%-d,x=%+8.2f,x+y=%Lf\n,a,x,x+y);左对齐正数也要加正号输出共占8位,其中小数占两位输出为longdouble型C语言程序设计---第3章113.3.2scanf()函数scanf()函数的一般形式为:intscanf(格式控制串,地址列表)“格式控制串”是由0个或多个格式转换说明组成的一个字符串序列。格式转换说明的一般形式为:%[*][width][h/l/L]输入格式符格式修饰符(见表3-4)见表3-3格式转换说明的作用是引导对下一输入项进行转换。“地址列表”中给出一个或多个输入项,输入项之间用逗号分隔。从概念上讲,输入项的表示形式是指针,指向存储输入数据的变量。因此,输入项必须指明变量的地址。C语言提供了一个取变量地址的运算符“&”,只要将它作用在变量上,就能得到该变量的地址。例如,&a,&b分别表示变量a和变量b的地址。C语言程序设计---第3章12例如,若要为int变量a和b从键盘输入数据,如果写作:scanf(%d%d,a,b);是不正确的。可用如下语句实现:scanf(%d%d,&a,&b);如果将上述语句应改为:scanf(%d,%d,&a,&b);即在两个格式转换说明之间插入一个逗号,输入数据时也必须输入一个逗号,如:123,4567↙要注意的是,不要轻易将“c”格式与其它格式混在一起用,以免出错。例如,设a为int型变量,ch是char型变量,对于语句:scanf(%d%c,&a,&ch);若输入为29□A/*□表示空格符*/其结果是将数值29送a,而将一个空格字符送ch。C语言程序设计---第3章133.4关于格式化输入和输出函数的进一步讨论3.4.1printf()和scanf()函数的返回值问题若成功,printf()函数返回输出的字符个数,出错时返回负数。/*本程序测试printf()函数的返回值*/#includestdio.hmain(){intcount;/*定义count,用来接收返回值*/floatr1=12345.12345678,r2=123.123456789;count=printf(r1=%f\nr2=%f\n,r1,r2);printf(count=%d\n,count);/*输出printf()函数的返回值*/}程序输出:r1=12345.123047r2=123.123459count=34C语言程序设计---第3章14scanf()函数也具有返回值,所不同的是,scanf()函数执行成功时的返回值是成功读取的变量数;如果第一个输入项读入就出错,则返回0。/*本程序测试scanf()函数的返回值*/#includestdio.hintmain(){intcount,a,b,c;count=scanf(“%d,%d,%d”,&a,&b,&c);printf(a=%d,b=%d,c=%d\tcount=%d\n,a,b,c,count);}执行上述程序,如果输入为:123,1234,12345↙则输出结果为:a=123,b=1234,c=12345count=3C语言程序设计---第3章153.4.2printf()函数的p格式符的应用在printf()函数中,p格式符用来输出指针的值,即指针所指对象的首地址。利用p格式符的这一特性,我们可以了解变量的空间分配情况。下面来看一个例子。/*本程序测试变量的空间分配情况*/#includestdio.hintmain(){inti,j,k;printf(&i=%p,&j=%p,&k=%p\n,&i,&j,&k);}执行后的输出为(不同的系统环境可能输出值不同,下面是Turbo2.0的一种输出):&i=650B:0FD6,&j=650B:0FD8,&k=650B:0FDAC语言程序设计---第3章163.4.3scanf()函数的“%[]”格式应用问题/*用“%[]”格式接收指定范围的字符*/#includestdio.hintmain(){int*ptr;/*定义一个指针*/scanf(“%[abcd]”,ptr);printf(“ptr=%s\n”,ptr);}设输入为:dabcaaagade↙程序输出为:ptr=dabcaaaC语言程序设计---第3章17/*用“%[]”格式接收指定范围的字符*/#includestdio.hintmain(){int*ptr;/*定义一个指针*/scanf(“%[^bcd,]”,ptr);printf(“%s\n”,ptr);}设输入为:Howareyou,John!↙程序输出为:Howareyou注:这是由于逗号作为不可接受字符,而作为字符串的定界符.C语言程序设计---第3章18/*本程序可接收任意字符串的输入*/#includestdio.hintmain(){int*ptr;/*定义一个指针*/scanf(“%[^\n]”,ptr);printf(“ptr=%s\n”,ptr);}设输入为:Howareyou!↙程序输出为:Howareyou!C语言程序设计---第3章193.4.4scanf()函数应用中两个最常见的问题1.空白符问题/*本程序测试格式转换说明%d\n的应用情况*/#includestdio.hintmain(void){inta;printf(Pleaseinputthedata:);scanf(“%d\n”,&a);/*注意这里加了一个换行符\n*/printf(“%d\n,a);}问题:被要求输入两个数才能正常结束原因:程序要求输入空白符,而空白符是数据的定界符C语言程序设计---第3章202.标准输入流中残留字符问题/*本程序测试标准输入流中残留字符的情况*/#includestdio.hintmain(void){inta;charc;scanf(%d,&a);/*接收一个整数*/scanf(%c,&c);/*接收一个字符*/printf(a=%d,c=%d\n,a,c);}注:在这里输入一个整数并按回车键后,程序就输出了结果!C语言程序设计---第3章211234\na1234A注:在这里输入一个整数1234并按回车键后,就相当于1234\n,这个\n就输入给字符变量c!C语言程序设计---第3章22本章全部练习都要做.做在练习本上.