自学C语言-5

第5章 常用的数据输入/输出函数

**C语言中,语句是用来向计算机系统发出操作指令的。当需要程序按照用户输入信息执行指令时,先要使用输入语句给程序发送指示。当程序解决了问题之后,还要使用输出语句将计算的结果显示出来。
本章致力于使学习者了解有关语句的概念,掌握如何对程序的输入/输出进行操作。
本章的知识架构及重难点如下:
自学C语言-5_第1张图片

5.1 语 句

一条语句经过编译后,会产生若干条机器指令。实际程序中通常包含若干条语句,用于完成一定的操作任务。

注意:
在编写程序时,声明部分不能算作语句。例如,"int iNumber;"就不是一条语句,因为不产生机器的操作,只是对变量提前进行了定义。

通过前面的介绍可知,程序包括声明部分和执行部分,其中执行部分由语句组成。

5.2 字符数据的输入/输出

本节将介绍标准I/O函数库中最简单也最容易理解的字符输入/输出函数getchar和putchar。

5.2.1 字符输出函数

输出字符数据使用的是putchar函数,作用是向显示设备输出一个字符。其语法格式如下:

int putchar(int ch);

使用该函数时,要添加头文件stdio.h。其中,参数ch为要输出的字符,可以是字符型变量或整型变量,也可以是常量。例如,输出字符A的代码如下:

putchar('A');

使用putchar函数也可以输出转义字符。例如,使用转义字符输出字符A:

putchar('\101');

【例5.1】打印喵喵字符画
在程序中使用putchar函数,输出喵喵字符画“(=_=)“,并在输出完毕之后换行。
自学C语言-5_第2张图片
(1)要使用putchar函数,首先要包含头文件stdio.h。
(2)putchar函数一次只能输出一个字符。要输出字符画,就需要多次调用putchar函数。
(3)字符画输出完毕后,使用putchar函数输出转义字符”\n",进行换行操作。
运行程序,显示效果如上图所示。

5.2.2 字符输入函数

字符数据输入使用的是getchar函数,其作用是从终端(输入设备)输入一个字符。getchar与putchar函数的区别在于getchar函数没有参数。使用getchar函数时,需要先添加头文件stdio.h。getchar函数的语法格式如下:

int getchar();

函数的值就是从输入设备得到的字符。例如,从键盘输入一个字符并赋给变量cChar,代码如下:

cChar=getchar();

注意:getchar函数只能接收一个字符,该字符可以赋给一个字符变量或整型变量,也可以不赋给任何变量,只作为表达式的一部分,如“putchar(getchar());"。这里,getchar函数作为putchar函数的参数,通过getchar函数从输入设备得到一个字符,然后通过putchar函数将字符输出。
【例5.2】输出字符对应的ASCII码值 在本实例中,使用getchar函数获取键盘输入的字符,然后利用字符型和整型之间的转换,输出字符对应的ASCII的值。
自学C语言-5_第3张图片
要使用getchar函数,首先要包括头文件stdio.h。主函数中定义一个字符型变量i,通过getchar函数得到输入的字符,赋值给i,然后利用字符型和整型间的转换,用printf函数输出对应的ASCII码值。运行程序,显示效果如上图所示。
【例5.3】getchar函数获取回车符 先来看一下使用getchar函数实现字符数据输入,代码如下:
自学C语言-5_第4张图片
运行结果如上图显示。当把代码的第8行”getchar()"这句代码删除,就可以获取回车符。代码如下:
自学C语言-5_第5张图片
运行程序,显示效果如上图所示。程序没有获取第二次的字符输入,而是进行了两次换行。

注意:getchar函数也可以不返回值,而是直接放在printf函数中使用。例如:
printf("%c\n",getchar());

编程训练:
训练1:输出笑脸 利用putchar函数输出笑脸_,输出效果如下:
_
自学C语言-5_第6张图片
训练2:输出大眼萌 在程序中使用putchar函数输出大眼萌表情“@_@",并且在字符表情输出完毕之后进行换行。输出结果如下:

@_@

自学C语言-5_第7张图片

5.3 字符串输入/输出

putchar和getchar函数都只能对单个字符进行操作,如果要操作字符串,则会很麻烦。C语言提供了两个专门对字符串进行操作的函数,分别为gets和puts函数。

5.3.1 字符串输出函数

字符串输出使用的是puts函数,作用是输出一个字符串到屏幕上。其语法格式如下:

int puts(char *str);

使用puts函数时,先要在程序中添加stdio.h头文件。其中,形式参数str是一个字符指针变量,用来接收要输出的字符串。例如,使用puts函数输出一个字符串:

puts("I LOVE CHINA!"); 					/*输出一个字符串常量*/

上述语句首先会输出一个字符串,之后会自动进行换行操作。这与printf函数有所不同,在前几章的实例中,使用printf函数进行转换时,要在其中添加转义字符"\n"。
puts函数会在字符串中判断“\0"结束符,遇到结束符时,后面的字符不再输出,并且自动换行。例如:

puts("I LOVE\0 CHINA!");									/*输出一个字符串常量*/

在上面的语句中,加上"\0"字符后,puts函数输出的字符串就变成了”I LOVE"。
说明:前面介绍到,编译器会在字符串常量末尾自动添加“\0"结束符,因此puts函数会在输出字符串常量后自动进行换行操作。
【例5.4】打印各种各样的”ILOVECHINA" 在本实例中,使用puts函数对字符串常量“ILOVECHINA"和字符串变量进行操作,在这些操作中观察puts函数的使用方式。

自学C语言-5_第8张图片
(1)字符串常量赋值给字符串指针变量。有关字符串指针的内容将在第10章中介绍,此时可以将其看作整型变量。为其赋值后,就可以使用该变量。
(2)第一次使用puts函数输出的字符串常量中,由于在该字符串中没有结束符”\0",所以会完整输出整个字符串,直到最后编译器为其添加结束符“\0"为止。
(3)第二次使用puts函数输出的字符串常量中,人为添加了两个”\0",因此只能输出第一个结束符之前的字符,然后进行换行操作。
(4)第三次使用puts函数输出的是字符串指针变量,函数根据变量的值进行输出。因为在变量的值中没有结束符,所以会完整输出整个字符串,直至最后编译器为其添加结束字符,然后进行换行操作。
(5)改变变量的值,在使用puts函数输出变量时,由于变量的值中包含一个结束符”\0",因此将输出第一个结束符之前的所有字符,然后进行换行操作。
运行程序,显示效果如上图所示。

5.3.2 字符串输入函数

字符串输入使用的是gets函数,作用是将读取的字符串(即用户输入的字符串)保存在str变量中,直到出现新的一行为止。其新行的换行符将会转换为空终止符“\0"。
使用gets函数前,要添加头文件stdio.h。gets函数的语法格式如下:

char *gets(char *str);

其中,str是一个字符指针变量,用来存储用户输入的字符串。例如,定义字符数组变量cString,然后使用gets函数获取输入字符,代码如下:

gets(cString);

上面的代码中,cString 变量获取了字符串,并将最后的换行符转换成了终止字符。
【例5.5】模拟用户注册系统 模拟用户注册系统。首先提醒用户输入账号、密码、姓名和身份证号,注册完毕后,显示用户输入的注册信息。代码如下:
自学C语言-5_第9张图片(1)因为要接收用户输入的账号、密码、姓名、身份证号等信息,所以定义了4个可以接收字符串的变量。account、password、name、IDcard为字符数组变量的标识符。关于字符数组的内容将第8章中介绍,此处知道此变量可以接收字符串即可。
(2)调用gets函数,函数参数为前面定义的account、password、name、IDcard4个变量。调用gets函数后,程序会等待用户输入字符,用户输入完一个字符串并按Enter键确定时,gets函数将获取字符串结束标志”\0",并将对应的字符串保存到上述4个变量中。
(3)使用puts函数将获取的字符串依次输出。
运行程序,显示效果如上图所示。
编程训练:
训练3:输出乔布斯语录 苹果公司的创始人乔布斯在2005年给斯坦福大学做毕业演讲中提到一句话:“Stay hungry,Stay foolish."。编写程序,输出该条语录的英文版和中文版。输出效果如下:
自学C语言-5_第10张图片
训练4:输出梁山好汉 编写程序,输出《水浒传》中的10个梁山好汉。输出效果如下:
自学C语言-5_第11张图片
自学C语言-5_第12张图片

5.4 格式输出函数

第1章中我们就接触到了scanf函数和printf函数。其中,printf函数是格式输出函数。printf函数的作用是向终端(输出设备)输出若干任意类型的数据,其语法格式如下:
printf(格式控制,输出列表)

1.格式控制
格式控制是用双引号括起来的字符串,也称为转换控制字符串。其中包括格式字符和普通字符。
1.格式字符:用来进行格式说明的字符,作用是将输出的数据转换为指定的格式。格式字符通过常以“%”开头。
2.普通字符:需要原样输出的字符,包括双引号内的逗号、空格和换行符。
2.输出列表:输出列表列出的是要进行输出的一些数据,可以是变量或表达式。
例如,要输出一个整型变量,代码如下:

int iInt=10;
printf("this is %d",iInt);

执行上面的语句,输出的字符是“this is 10"。格式控制双引号中的字符是”this is %d",其中的“this is "字符串是普通字符,而”%d"是格式字符,表示输出的是后面的iInt数据。
printf是函数,“格式控制”和“输出列表”都是函数参数,因此printf函数的一般形式可表示为:

printf(参数1,参数2...,参数n)

函数中的每个参数都必须按照给定的格式和顺序依次输出。例如,输出一个字符型变量和整型变量的代码如下:

printf("the lnt is %d,the Char is %c",ilnt,cChar);

表5.1列出了有关printf函数的格式字符。
自学C语言-5_第13张图片

注意:printf函数中,除X、E、G外,其他格式字符必须使用小写字母,如%d不能写成%D。

【例5.6】牛吃草问题 一头牛可以吃2千克草,现有45千克草,可供几头牛吃饱。首先定义相应的变量,然后利用表达式计算结果,最后用printf函数对结果进行输出。具体代码如下:
自学C语言-5_第14张图片
自学C语言-5_第15张图片
程序中定义了3个整型变量,并为变量赋值。第6行使用算术表达式计算结果,并将结果赋给变量num。在printf函数中,使用格式符号"%d"进行输出。
运行程序,显示效果如上图所示。另外,在格式说明中,在"%"符号和上述格式字符间可以插入如表5.2所示的几种附加符号。
自学C语言-5_第16张图片
如果想输出“%”符号,可在格式控制处使用“%%”进行输出。
【例5.7】打印变幻莫测的“MingRiKeJi” 在本实例中,使用printf函数的附加格式说明字符,对输出的数据进行更为精准的格式设计。
自学C语言-5_第17张图片
(1)在程序代码中,定义的长整型变量在使用printf函数输出时,应该用“%ld”格式字符。
(2)“%s”用来输出一个字符串的格式字符,在结果中可以看到输出了字符串“MingRi”。
(3)“%10s”格式为“%ms”,表示输出字符串占m列。如果字符串长度大于m,则突破m的限制,将字符串全部输出;若字符串长度小于m,则用空格进行左补齐。可以看到在字符串“MingRi”前存在4个空格。
(4)“%-10s”格式为“%-ms”,表示如果字符串长度小于m,则在m列范围内,字符串向左对齐,右补空格。
(5)“%10.2s”格式为“%m.ns”,表示输出占m列,但只取字符串左端n个字符。这n个字符输出在m列的右侧,左补空格。
(6)“%-10.2s”格式为“%-m.ns”,其中m、n含义同上,n个字符输出在m列的左侧,右补空格。如果n>m,则m自动取n值,即保证n个字符正常输出。
运行程序,显示效果如下图所示:
自学C语言-5_第18张图片

编程训练:
训练5:一日之计在于晨 定义两个变量 “char* str=” 日之计在于晨" " 和“int num=1”, 在控制台中输出“一日之计在于晨"。
自学C语言-5_第19张图片
自学C语言-5_第20张图片
训练6:鸡兔同笼问题 鸡、兔关在同一只笼子里,已知有35个头、94只脚,问笼子里几只鸡和几只兔。计算公式为:鸡的数量=(4鸡兔总头数-鸡兔总脚数)/2; 兔的数量=(鸡兔总脚数-2鸡兔总头数)/2。运行结果如下。
自学C语言-5_第21张图片
自学C语言-5_第22张图片

5.5 格式输入函数

与格式输出函数printf相对应的是格式输入函数scanf。该函数的功能是按照指定的格式接收用户在键盘上输入的数据,最后将数据存储在指定的变量中。
scanf函数的一般格式如下:

scanf(格式控制,地址列表)

其中,“格式控制"参数与printf函数相同,”%d"表示十进制整型,“%c"表示单个字符;"地址列表"参数用于给出接收数据变量的地址。

注意:scanf函数参数的"地址列表"处要使用变量地址,而不是变量的标识符,否则会编译报错。

例如,得到一个整型数据的代码如下:

scanf("%d",&ilnt);								/*得到一个整型数据*/

在上面的代码中,“&“最取地址符号,表示取iInt变量的地址。用户不用关心变量的地址具体是多少,只要在变量的标识符前加”&”,就可以表示存取变量的地址。

误区警示:
scanf函数中,当输入的数据是基本类型,如整型、字符型、实型时,需要使用取地址符号。当输入的变量本身就是一个地址时,如数组名、字符串指针等,不需要再使用"&"符号。
关于数组和指针的知识将在第8章和第10章中介绍,这里了解就行。

表5.3中列出了scanf函数中常用的格式字符。
自学C语言-5_第23张图片

说明:
格式字符"%s"用来输入字符串。将字符串送到一个字符数组中,在输入时以非空白字符开始,以第一个空白字符结束。字符串以串结束标志"\0"作为最后一个字符。

【例5.8】根据身高和体重计算BMI值 输入身高和体重,计算身体质量指数(BMI),计算公式为“BMI=体重/身高的平方”。
在本实例中,利用scanf函数得到用户输入的两个数据,即身高和体重,因为scanf函数只能用于输入操作,所以若在屏幕上显示信息,还需要使用输出函数。
自学C语言-5_第24张图片
(1)为了能接收用户输入的整型数据,定义了两个实型变量height和weight。
(2)scanf函数只能接收输入的数据,不能显示信息,所以先使用printf函数输出一段信息提示。
(3)调用scanf格式输入函数,在函数参数中使用双引号将格式字符括号起来,“%f”表示输入的是十进制的小数。在参数中的地址列表位置使用“&”符号表示变量的地址。
(4)变量height和weight得到用户输入的数据后,根据公式计算BMI值,再调用printf函数将BMI值输出。注意,printf函数使用的是变量的标识符,而不是变量地址。scanf函数使用的是变量地址,而不是变量的标识符。
运行程序,显示效果如下图所示。
自学C语言-5_第25张图片

说明:程序是怎样将输入的内容分别保存到两个指定变量中的呢?scanf函数使用空白字符分隔输入的数据,这些空白字符包括空格、换行和制表符(tab)。本例中使用了换行作为空白字符。
注意:
使用scanf函数输入数据时,实际输入的变量格式必须与scanf函数参数中指定的变量格式、顺序一一对应。例如:
scanf("%d %c %f", &a,&b,&c);
这里要求输入3个变量,格式分别是整型、字符型和浮点型,数据间采用空格进行分隔。用户通过控制台实际输入时,也必须按照这样的格式及顺序进行。如果scanf函数里使用的格式列表是这样的"%d#%c#%f",那么在输入数据时,就需要使用“#”进行分隔。

相应地,scanf函数中也有附加格式,用于更为具体的格式说明,如表5.4所示。
自学C语言-5_第26张图片
【例5.9】输入不同类型的数据 在本实例中,依次使用scanf函数的附加格式输入,对比输入前后的结果,观察附加格式的效果。
自学C语言-5_第27张图片
自学C语言-5_第28张图片
(1)为了scanf函数能接收数据,需要在程序代码中先定义所使用的变量。为了演示不同格式字符的情况,定义的变量类型有长整型、短整型和字符数组。
(2)使用printf函数显示提示信息,提示待输入的数据为长整型,调用scanf函数使变量iLong得到用户输入的数据。在scanf函数的格式控制部分,使用格式字符%ld表示长整型。
(3)再使用printf函数显示提示信息,提示输入的数据为短整型。调用scanf函数时,使用格式字符%hd表示短整型。
(4)使用格式字符"“的作用是表示指定的输入项在读入后不赋给相应的变量。具体分析如下:第一个“%d”是输入iNumber1变量,第二个”%d"是输入iNumber2变量,但是在第二个"%d"前有一个"“附加格式说明字符,这样第二个输入的值被忽略,也就是说,iNumber2变量不保存输入的值。
(5)”%s"是用来表示字符串的格式字符,将一个整数n放入"%s"中间,可以指定数据的宽度。在程序中,scanf函数中指定的数据宽度为3,因此在输入字符串时只接收前3个字符
(6)利用printf函数将获取的输入数据输出。
运行程序,显示效果如上图所示。
编程训练:
训练7:输出《拍手歌》使用scanf函数输入数值,用printf函数输出《拍手歌》。例如,输入数值1,输出”你拍1,我拍1“。运行结果如下:

请输入你想拍几:
1
你拍1,我拍1

自学C语言-5_第29张图片
自学C语言-5_第30张图片
训练8:计算圆的周长和球的体积 使用scanf函数输入一个半径,计算对应圆的周长和对应球的体积、运行结果如下:
自学C语言-5_第31张图片
自学C语言-5_第32张图片

5.6 顺序程序设计应用

本节将介绍几个顺序程序设计的实例,帮助读者巩固前面所讲的内容。
【例5.10】交换数值 在本实例中,利用scanf函数输入x,y两个数值。交换后调用printf函数输出。具体代码如下:
自学C语言-5_第33张图片
(1)使用printf函数显示一串提示信息,提示输入两个数据,调用scanf函数使变量x,y得到用户输入的数据。
(2)代码第7~9行实现了x,y两个数的交换。最后利用printf函数将调换后的两个数输出。运行程序,显示效果如下图所示。
自学C语言-5_第34张图片
【例5.11】英文大小写字符互相转换 要实现英文大、小写字符的相互转换,就需要对C语言的ASCII码有所了解。将大写字符的ASCII码加上32,即可转换成小写字符的ASCII码。
自学C语言-5_第35张图片
(1)为了将大写字符转换为小写字符,要为其定义变量并进行保存。cBig表示要输入的大写字符变量,而cSmall表示要转换成的小写字符变量。
(2)输出信息,提示用户输入字符。因为得到一个输入字符即可,所以在此处使用getchar函数就可以满足程序的要求。
(3)大写字符与小写字符的ASCII码值相差32。例如,字符A的ASCII值为65,a的ASCII值为97。因此要将一个大写字符转换成小写字符,将大写字符的ASCII值加上32即可。
(4)字符变量cSmall得到转换的小写字符后,利用printf格式输出函数将字符输出,其中使用的格式字符为"%c"。
运行程序,显示效果如上图所示。
编程训练:
训练9:显示菱形图 使用printf函数的附加格式字符输出菱形图案,运行结果如下:
自学C语言-5_第36张图片
训练10:记录个人基本信息 使用scanf函数输入你的性别、年龄、体重(kg)和身高(m),运行结果如下:
自学C语言-5_第37张图片

5.7 实践与练习

综合练习1:模拟缴纳电费 编写程序,先模拟输出如图5.12所示的电费账单,然后要求用户输入缴费金额(大于574元),输出当前账户电费余额,输出结果如图5.13所示。
自学C语言-5_第38张图片
综合练习2:秘密电文 为了防止敌方获取我方机密,需要以数字代替我方文件中的字母,即用字母的ASCII码值替换字母。编写程序,输入字母后,输出该字母对应的ASCII码值。输出结果如下:
自学C语言-5_第39张图片
综合练习3:挑战10秒 某商场推出“挑战10秒”打折促销活动,编写程序,实现效果如图5.14所示。
自学C语言-5_第40张图片
自学C语言-5_第41张图片
自学C语言-5_第42张图片
自学C语言-5_第43张图片
综合练习4:小写变大写 使用getchar函数输入一个小写字母,输出对应的大写字母。输出结果如下:

	![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c3e4af2c56c5447aaa79779a1a71b111.png#pic_center)

自学C语言-5_第44张图片
综合练习5:模拟用户登录 利用gets函数输入用户的账号和密码,用puts函数输出对应的用户账号和密码,输出结果如下:
自学C语言-5_第45张图片
综合练习6:模拟手机充值 编写一个C语言程序,模拟手机充值信息提示。输出结果如下:
自学C语言-5_第46张图片
综合练习7:给电影打分 《肖申克的救赎》是一部经典影片。编写程序,征集评分。打分时只能输入数字1~9,输出根据用户打分形成的星级(*)评价。输出结果如下:
自学C语言-5_第47张图片
综合练习8:能量兑换包 图5.15为淘宝能量兑换成功的界面,参照该图,定义浮点型变量表示红包金额,提示“请输入您的能量兑换红色的金额”,输入完成后使用printf函数输出变量。实现效果如图5.16所示。
自学C语言-5_第48张图片
自学C语言-5_第49张图片

你可能感兴趣的:(c语言)