1、第6章用户与计算机的交互输入和输出p 标准输入输出 p 格式化输入输出 p 字符输入输出 p 字符串输入输出 p 跟我上机 第6章用户与计算机的交互输入和输出 标准输入输出 p 格式化输入输出 p 字符输入输出 p 字符串输入输出 p 跟我上机 第6章用户与计算机的交互输入和输出 标准输入输出 格式化输入输出 p 字符输入输出 p 字符串输入输出 p 跟我上机 第6章用户与计算机的交互输入和输出 标准输入输出 格式化输入输出 字符输入输出 p 字符串输入输出 p 跟我上机 第6章用户与计算机的交互输入和输出 标准输入输出 格式化输入输出 字符输入输出 字符串输入输出 p 跟我上机 第6章用户与
2、计算机的交互输入和输出 标准输入输出 格式化输入输出 字符输入输出 字符串输入输出 跟我上机 用户与计算机的交互输入和输出输入/输出是计算机最基本的行为,也是任何语言必需的功能,起到了用户和计算机桥梁的作用,那么,在C语言的世界里,输入和输出是怎么实现的?怎么样高速、高效的进行输入和输出呢?我们就在这一章来进行讨论吧!6.1 标准输入输出 程序如何知道用户想要的内容,用户又如何得知程序运算的结果呢?可以通过输入输出来实现。我们先来看下面的程序运行结果。6.1 标准输入输出 在命令行中,提示用户输入1个整数,当用户输入100,并按【Enter】键后,程序显示“您输入的整数是:100”,这就是个简
3、单的输入输出的过程:程序提示用户输入数据程序读取后输出,实现了用户和计算机的交互。6.1 标准输入输出此程序的代码如下。01#include02 int main(void)03 04 int i;05 printf(请输入1个整数:n);/*提示用户输入*/06 scanf(%d,&i);/*读取输入数据*/07 printf(您输入的整数是:%dn,i);/*输出数据*/08 return 0;09 以上程序是通过printf()函数和scanf()函数来实现输入输出的,这些函数都包含在C语言的库函数中。6.1 标准输入输出C语言本身并不提供输入输出语句,而是用一组库函数来实现数据的输入和
4、输出,由于不同的C系统提供不同的输入输出函数,而一些常用的函数是各系统中共有的,称之为标准输入输出函数。本章就来学习这些标准的输入输出函数,包括上面程序所提到的格式化输入(printf)输出(scanf)函数,以及字符输入(getchar)输出(putchar)函数和字符串输入(gets)输出(puts)函数等。6.2 格式化输入输出6.2.1 格式化输出函数printf()6.2.2 格式控制字符6.2.3 格式化输入函数scanf()6.2 格式化输入输出格式化是指按照一定的格式,格式化输入输出就是指按照一定的格式读取来自输入设备的数据和向输出设备输出数据。符合格式化输入输出的代表函数是p
5、rintf()函数和scanf()函数。这两个函数是程序中用的最多的输入输出函数,也是本章的重点。6.2.1 格式化输出函数printf()在前面章节中我们用的最多的就是print()函数,但代码中包含的%d、%f和%c有什么含义和区别呢?本节就来深入学习此函数详细用法。printf()函数,作用是将计算机中数据,按照特定的格式输出到终端,使用户能从终端查看数据,它是输出数据的接口。使用格式如下:printf(,);例如:01 int i=10,j=20;02 printf(“欢迎来到C语言的世界!n”);/*输出引号内的内容并换行*/03 printf(“i=%d,j=%dn”,i,j);/
6、*输出变量i和j的值并换行*/6.2.1 格式化输出函数printf()我们再来看以下代码。01 printf(“Hello n”)02 printf(a,A n);03 printf(班级平均成绩为:%fn,avg);04 printf(First output i=%dn,i);从这些语句中,我们可以很容易的看出第1行和第2行没有参数,原样输出,第3行和第4行都用到了参数。6.2.1 格式化输出函数printf()我们还可以把该函数的使用格式细分一下。没有参数时,调用格式如下:printf(非格式字符串);使用这种格式输出的是双引号内的原样内容,通常用于提示信息的输出。有参数时,调用格式如
7、下:printf(“格式字符串”,参数列表);使用这种格式时,格式字符串内包含一个或多个格式控制字符。格式控制字符以“开头,紧跟其后的d、s、f、c等字符,用以说明输出数据的类型。格式控制字符的个数与参数列表中参数的个数相等,并且一一对应,输出时,用参数来代替对应的格式控制字符。参数可以是变量,也可以是表达式等。6.2.1 格式化输出函数printf()【范例6-1】printf函数的使用。01#include02 int main(void)03 04 int num;05 char r;06 float f;07 printf(请输入1个整数,1个字符,1个浮点型的数据:n);/*输出引号
8、中的内容并换行*/08 scanf(%d,%c,%f,&num,&r,&f);/*输入数据,给num,r,f分别赋值*/09 printf(输入的数据是:num=%d,r=%c,f=%f,num,r,f);/*输出变量的值*/10 printf(n);/*换行*/11 return 0;1213此段代码定义了3个变量,分别是int、char和float类型,第7行没有参数是原样输出引号中的内容后换行,第8行是输入数据,给num,r和f分别赋值,第9行是输出变量的值,用到了格式控制字符%d、%c和%f,%d代表的是int类型的格式,%c代表的是char类型的格式,%f代表的是float类型的格式
9、,与后面的参数类型一一对应。第10行的调用格式与第7行的一样,但第10行双括号内的是转义字符,所以起到了换行的作用。6.2.2 格式控制字符在上面的程序中,我们所使用的%d、%c和%f就是格式控制字符,除了这些外还有很多,下表所示就是C语言程序中常用的格式控制字符。格式控制字符含义d以十进制形式输出整数值o以八进制形式输出整数值x以十六进制形式输出整数值u以无符号数形式输出整数值c输出字符值s输出字符串f输出十进制浮点数e以科学计数法输出浮点数g等价于%f或%e,输出两者中占位较短的6.2.2 格式控制字符下面详细介绍这些格式控制字符的使用方法。1.d格式控制字符使用如下。%d:以十进制形式输
10、出整数。%md:与%d相比,用m限制了数据的宽度,是指数据的位数,当数据的位数小于m时,以前面补空格的方式输出,反之,如果位数大于m,则按原数输出。%ld:输出长整型的数据,其表示数据的位数比%d多。6.2.2 格式控制字符【范例6-2】格式控制字符d的应用。01#include 02 int main(void)03 04 int i=123456;/*初始化变量*/05 printf(%dn,i);/*按%d格式输出数据*/06 printf(%5dn,i);/*按%md格式输出数据*/07 printf(%7dn,i);/*按%md格式输出数据*/08 return 0;910第6、7行
11、中使用了%md形式,其中第6行的m=5,数据位数6m,输出原数据;第7行中的m=7,数据位数6m,以前面补空格的方式输出,所以在输出结果中第3行的123456前多了一个空格。6.2.2 格式控制字符2.u格式控制字符%u:以十进制形式输出无符号的整数。%mu:与%md类似,限制了数据的位数。%lu:与%ld类似,输出的数据是长整型,范围较大。6.2.2 格式控制字符3.f格式控制字符%f:以小数形式输出实数,整数部分全部输出,小数部分为六位。【范例6-3】格式控制字符f的应用。6.2.2 格式控制字符01#include02 int main(void)03 04 float f1=11.11
12、0000811;/*定义一个float类型的变量f1并赋值*/05 float f2=11.110000;/*定义一个float类型的变量f2并赋值*/06 printf(%fn,f1);/*按%f的格式输出f1*/07 printf(%fn,f2);/*按%f的格式输出f2*/08 return 0;910本例中定义的f1和f2的小数位数不同,但是输出后位数都为6位,这是问什么呢?是因为%f格式输出的数据小数部分必须是6位,如果原数据不符合,位数少的时候补零,位数多的时候小数部分取前6位,第7位四舍五入。6.2.2 格式控制字符%m.nf:以固定的格式输出小数,m指的是包括小数点在内的数据的
13、位数,n是指小数的位数,当总的数据位数小于m时,数据左端补空格,如果大于m时,原样输出。%-m.nf:除了%m.nf以外,要求输出的数据向左靠齐,右端补空格。6.2.2 格式控制字符【范例6-4】格式控制字符%m.nf和%-m.nf格式符练习。01#include 02 int main(void)03 04 float f=123.456;/*初始化变量*/05 printf(%fn,f);/*按%f格式输出*/06 printf(%10.1fn,f);/*按%m.nf格式输出*/07 printf(%5.1fn,f);08 printf(%10.3faaan,f);09 printf(%-
14、10.3faaan,f);/*按%-m.nf格式输出*/10 return 0;11 6.2.2 格式控制字符4.c格式控制字符:输出单个字符5.s格式控制字符:输出字符串%s、%ms和%-ms与前面介绍的几种用法相同,故省略,在此,我们介绍一下%m.ns和%-m.ns两种。%m.ns:输出m位的字符,从字符串的左端开始截取n位的字符,如果,n位小于m位,则左端补空格。%-m.ns:与%m.ns相比是右端补空格。6.2.2 格式控制字符【范例6-5】m.ns和-m.ns格式符练习。01#include02 int main(void)03 04 printf(%sn,Hello);/*按%s格
15、式输出*/05 printf(%5.3sn,Hello);/*按%m.ns格式输出*/06 printf(%-5.3sn,Hello);/*按%-m.ns格式输出*/07 return 0;89这个例子是练习%m.ns格式和%-m.ns输出,并比较二者输出的区别。第4行是原样输出,%s格式。第5行是%m.n格式输出,共m位,从“Hello”中截取前3位,并在前面补两个空格。第6行与第5行的不能是空格是补在字符的后端。若nm时,m就等于n,保证字符显示n位。6.2.2 格式控制字符6.格式控制字符以八进制形式表示数据。即把内存中数据的二进制形式转换为八进制后输出,由于二进制中有符号位,那么就把符
16、号位也作为八进制的一部分进行输出。7.格式控制字符以十六进制形式表示数据。与%o一样,也把二进制中的符号位作为十六进制中的一部分进行输出。6.2.2 格式控制字符【范例6-6】%o和%x格式符练习。01#include02 int main(void)03 04 int n1=0,n2=1,n3=-1;/*初始化三个变量*/05 printf(%d,%o,%xn,n1,n1,n1);/*分别按%d,%o,%x格式输出n1*/06 printf(%d,%o,%xn,n2,n2,n2);/*分别按%d,%o,%x格式输出n2*/07 printf(%d,%o,%xn,n3,n3,n3);/*分别按
17、%d,%o,%x格式输出n3*/08 return 0;9这个例子是在比较%d,%o,%x三种格式对输出同一个数结果有什么不同,特举了1,0和-1三个具有代表性的数字进行试验。我们知道0既可以看成是正数,也可以看成是负数,与运行时的计算机系统有关,有的系统把它作为正数存储,本次运行的计算机就是这样,但也有的计算机把它作为负数。8.e格式控制字符:以指数形式输出数据。9.g格式控制字符:在%e和%f中自动选择宽度较小的一种格式输出。6.2.3 格式化输入函数scanf()scanf()函数:把从终端读取的符合特定格式的数据输入计算机程序中使用,是输入数据的接口。函数调用格式:scanf(,);例
18、如:01 int i,j;02 scanf(“%d”,%i);/*把输入的数据赋值给变量i*/03 scanf(“%d,%d”,&i,%j);/*分别把输入的数据赋值给变量i和j*/6.2.3 格式化输入函数scanf()我们知道变量是存储在内存中的,变量名就是一个代号,内存为每个变量分配一块存储空间,当然,存储空间也有地址,也可是说成是变量的地址。但是,计算机怎么找到这个地址呢?这就要到地址操作符&,在&的后面跟上地址就能获取计算机中变量的地址。其实,scanf函数的作用就是把输入的数据根据找到的地址存入内存中,也就是给变量赋值。估计,还有读者会问,变量r里面不是有内容了吗?把输入的字符在放
19、进去不会出错吗?其实,计算机是这样的,当把一个数据放入一个内存空间里时,会自动覆盖里面的内容。所以,变量保存的是最后输进的值。6.2.3 格式化输入函数scanf()【范例6-7】scanf函数的使用。01#include02 int main(void)03 04 int i=0;05 printf(请输入一个整数:);06 scanf(%d,&i);/*输入数据,给变量i赋值*/07 printf(i=%dn,i);/*输出i的值*/08 printf(i在内存中的地址为:%on,&i);/*以八进制形式输出变量i在内存中的地址*/09 return 0;10 6.2.3 格式化输入函数s
20、canf()【范例6-8】输入多个值。01#include02 int main(void)03 04 int i=0;05 char a=0;06 float f=0.0;07 printf(请输入1个整型、1个字符型和1个浮点型的值:n);08 scanf(%d,%c,%f,&i,&a,&f);/*输入三个数据,分别给变量赋值*/09 printf(i=%d,a=%c,f=%fn,i,a,f);/*输出三个变量的值*/10 return 0;11 6.3 字符输入输出6.3.1 字符输出函数putchar()6.3.2 字符输入函数getchar()6.3 字符输入输出字符的输入输出是程序
21、经常使用的操作,频率比较高,所以C库函数中专门设置了putchar函数和getchar函数对字符的输入输出进行控制。6.3.1 字符输出函数putchar()putchar函数:把单个字符输出到标准输出设备。调用格式:putchar(v);/*v是一个变量*/例如:01 char v=0;02 putchar(A);/*输出单个字符A*/03 putchar(v);/*输出变量v的值*/04 putchar(n);/*执行换行效果,屏幕不显示*/6.3.1 字符输出函数putchar()【范例6-9】putchar函数的用法。01#include02 int main(void)03 04 c
22、har r=0;/*初始化变量*/05 printf(请输入一个字符:);/*输出提示*/06 scanf(%c,&r);/*输入及给r赋值*/07 putchar(r);/*输出r的值*/08 putchar(n);/*换行*/09 putchar(a);/*输出字符常量*/10 putchar(n);/*换行*/11 return 0;1213从这个例子中我们可以看出,putchar函数可以输出字符变量,字符常量,也可以使用转义字符,起到一些特殊的作用。在这里putchar(r)和printf(%c,r)作用是一样的,都是输出字符变量r的值。而printf(n)和putchar(n)作用是
23、相同的,都是换行。不光是换行,只要是转义字符,这两种形式的作用是相同的。6.3.2 字符输入函数getchar()getchar函数:从标准输入设备上读取单个字符,返回值为字符。调用格式:getchar();例如:char c;c=getchar();/*把输入的字符赋给变量c*/6.3.2 字符输入函数getchar()【范例6-10】getchar函数的使用。01#include02 int main(void)03 04 char r=0;/*变量初始化*/05 r=getchar();/*字符输入*/06 putchar(r);/*输出变量*/07 putchar(n);/*换行*/0
24、8 return 0;910第5行是输入字符的语句,和scanf(%c,&r)的作用一样,第6行是输出字符的语句,和printf(%c,r)的作用相同,第7行是换行。6.4 字符串输入输出6.4.1 字符串输出函数puts()6.4.2 字符串输入函数gets()6.4 字符串输入输出我们在编程的时候经常要对字符进行操作,但是,和字符串的操作相比,字符的使用相对要少的多,就像我们用英语单词,语句比单独用26个字母的概率大很多一样。所以,对字符串起作用的函数是我们必须掌握的输入输出函数。puts函数和gets函数就是对字符串操作的函数。6.4.1 字符串输出函数puts()puts函数:向标准输
25、出设备输出已经存在的字符串并换行。函数调用格式:puts(s);/*s为字符串变量*/例如:01 char str=”Hello,C!”;/*定义一个数组,储存了一串字符串*/02 char*f;/*定义了一个指针*/03 f=”Hello,C!”;/*指针指向一个字符串*/04 puts(str);/*输出字符串*/05 puts(f);/*输出字符串*/格式里的字符串变量s在这里是数组str和指针f。puts()函数的作用与printf(%sn,s)相同输出字符串并换行。6.4.1 字符串输出函数puts()注 意:数组是同一类型的数据的集合,指针是用来表示内存地址的,后面会有独立的章节介
26、绍,这里我们只要知道数组变量和指针变量可以存储字符串就行了。6.4.2 字符串输入函数gets()gets函数:读取标准输入设备输入的字符串,直到回车结束。函数调用格式:gets();例如:01 char s20,*f;/*定义一个数组和一个指针*/02 gets(s);/*获取输入的字符串*/03 gets(f);/*获取输入的字符串*/用gets函数获取的字符串一般是放在字符变量里,也是用数组变量和指针变量。6.4.2 字符串输入函数gets()【范例6-11】字符串的读写。01#include02 int main(void)03 04 char str15;05 printf(请输入字符串:);06 gets(str);/*输入字符至数组变量str*/07 printf(输入的字符串是:);08 puts(str);/*输出字符串*/09 return 0;1011第6行是输出字符串,第7行是输出,大家可以看到程序中没有换行的语句,但是输出结果中却换行了,这是因为什么呢?这主要是gets函数的功劳,gets函数除了有输入字符串的功能外,还有换行的作用。6.6 跟我上机编写程序,实现输入一名学生的姓名,课程名和成绩,并把这些信息在屏幕上显示出来。注意:姓名,课程名是字符串,成绩是浮点型的数字,显示时只能显示一位小数。