第4章 进进出出的C语句
其实在本书前几章的内容中,多次使用了printf函数和scanf函数。好奇的读者肯定会问这两个函数有什么用呢?其实这两个函数是最为常用的输入和输出函数,在本章的内容中,将详细讲解数据的输入和输出问题。
4.1 引出问题
9月12日,12:00,晴
今天参加了一个培训,讲师在黑板上画了一个有人生寓意的图(见图4-1):中间站着一个人,周围有一座房子、一辆汽车、一棵树和一些朋友。讲师说:“这是你的舒服区,图里面的东西对你至关重要:你的住房、你的家庭、你的朋友,还有你的工作。在这个范围内,你会觉得自在、安全,远离危险和争端。”讲师最后说道:“你想从这个区出来吗?还是一辈子待在里面?”最后他在黑板上写了7个大字——进进出出的人生。
图4-1 进进出出的人生
我:“这里的输入和输出应该是数据的输入和输出吧!”
KNOWALL:“C语言中的数据在语句中是进进出出的,输入和输出是必需的过程。C语言项目程序是由大量的C语句构成的,语句是一条完整的指令,C语言通过语句的输入输出来完成某项功能。C语言中最基本的语句是函数语句,这些函数能够实现一些不同的功能。我给你出一个题目:尝试输出显示不同格式的变量a和b值。执行后效果如图4-2所示。”
图4-2 执行效果
4.2 语句——C程序的最重要组成
9月12日,12:20,晴
我:“语句应该是由变量和表达式构成的吧!”
KNOWALL:“语句是一门编程语言的必备组成部分!C语言项目程序是由大量的C语句构成的,语句是一条完整的指令,能够命令计算机执行特定的任务。C语句通常是以分号‘;’结束的,#define和#include语句除外。”
4.2.1 C语句简介
C语言程序的组成元素比较多,小到变量和常量,大到函数、数组和语句。但是从整体上看,C语言程序的结构比较清晰。C语言程序的基本结构如图4-3所示。
图4-3 C语言程序结构
C程序的执行部分是由语句组成的,程序的功能也是由执行语句实现的,C语句可以分为5类。
1.函数调用语句
由函数名、实际参数和分号“;”组成,其一般格式如下:
函数名(实际参数表);
经常所说的执行函数语句,就是调用函数体并把实际参数赋予函数定义中的形式参数,然后执行被调函数体中的语句来求取函数值。
例如下面的函数语句用于调用库函数,输出字符串。
printf("C Program");
实际上函数语句也属于表达式语句,因为函数调用也属于表达式的一种。只是为了便于理解和使用,才把函数调用语句和表达式语句分开来讲。
2.表达式语句
表达式语句由表达式加上分号“;”组成,其一般格式如下:
表达式;
经常所说的执行表达式语句就是计算表达式的值。例如下面是一个赋值表达式:
x=3
而下面的都是语句:
x=a+b; //赋值语句; a+b; //加法运算语句,但计算结果不能保留,无实际意义; i++; //自增1语句,i值增1。
3.复合语句
复合语句就是把多个语句用大括号“{}”括起来组成的语句,复合语句又通常被称为分程序。在程序中应把复合语句看成是单条语句,而不是多条语句。例如下面的语句就是一条复合语句:
x=y+z; a=m+n; printf("%d%d",x,a);
复合语句内的各条语句都必须以分号“;”结尾,在“}”外不能加分号“;”。
4.空语句
只有分号“;”组成的语句称为空语句。空语句是什么也不执行,在程序中可用作空循环体。例如下面的代码第2行语句就是空语句:
while(getchar()!='\n') ;
上述语句的功能是:只要从键盘输入的字符不是回车符则重新输入。
5.控制语句
控制语句能控制程序的流程,用于实现程序的各种结构方式。控制语句由特定的语句定义符组成。C语言中有9种控制语句,分为以下3类。
(1)条件判断语句:if语句、switch语句;
(2)循环执行语句:do while语句、while语句、for语句;
(3)转向语句:break语句、goto语句、continue语句、return语句。
注意
C语言中允许一行同时写几个语句,也允许一个语句被拆开后写在几行上,并且书写格式有多种。
4.2.2 看空白对语句的作用
9月12日,12:40,晴
颓废的生活不是新潮,而是堕落。生活对于每个人都是公平的,在这方面给你的不够,在其他方面会有补偿的。活就要活得精彩,给自己的人生涂出颜色吧,不要给自己留下一片空白!我:“此处的空白是通过空格键输入的吧!”
KNOWALL:“对,空白是什么也没有输入!在C语言中,编译器在读取源代码时,只会查找语句中的字符和末尾的分号‘;’,而会忽略里面的空白(包括空格、制表符和空行)。”在C语言中,如下两行代码是等价的:
a=b+c; a=b+ c;
甚至和下面的代码也是等价的:
a= b+ c;
但是空白忽略并不是意味着C程序中的所有空白都将被忽略。字符串中的空白和制表符就不能被忽略,它们会被认为是字符串的组成部分。字符串常量会用引号将一系列的字符括起来,在编译时会逐字地进行解释,而不会忽略其中的空格。例如下面的两段字符串是不相同的:
"My name is薛小龙" "My name is薛 小龙"
执行后,后者的间隔会大于前者的间隔,具体间隔大小和代码中的间隔大小一致。
4.2.3 赋值语句给你一个值
9月12日,12:50,晴
我:“赋值语句应该和赋值表达式类似,就是给语句一个值!”
KNOWALL:“赋值语句是由赋值表达式再加上分号构成的!”
赋值语句的一般格式如下:
变量=表达式;
赋值语句的功能和特点都与赋值表达式相同,在使用时需要注意以下4点。
(1)因为在赋值符“=”右边的表达式也可以是一个赋值表达式,所以下述的形式是正确的:
变量=(变量=表达式);
上述格式就形成了嵌套格式,将其展开之后的一般格式如下:
变量=变量=…=表达式;
例如下面的语句:
a=b=c=d=e=10;
按照赋值运算符的右结合性,上述语句等效于下面的语句:
e=10; d=e; c=d; b=c; a=b;
(2)注意在变量说明中给变量赋初值和赋值语句的区别。
给变量赋初值是变量说明的一部分,赋初值后的变量与其后的其他同类变量之间仍必须用逗号“,”间隔,而赋值语句则必须用分号“;”结尾。例如下面的语句:
int a=10,b,c;
(3)在进行变量说明中,不允许连续给多个变量赋初值。例如下面的代码是错误的:
int a=b=c=10
必须改为如下格式:
int a=10,b=10,c=10;
而赋值语句允许连续赋值。
(4)注意赋值表达式和赋值语句的区别。赋值表达式是一种表达式,它可以出现在任何允许表达式出现的地方,而赋值语句则不能。例如下述语句是合法的:
if((x=y+10)>0) z=x;
上述语句的功能是,若表达式x=y+10的值大于0,则z=x。
而下面的语句是非法的:
if((x=y+10;)>0) z=x;
因为“x=y+10;”是语句,所以不能出现在表达式中。
4.3 输入和输出,是一个进进出出的过程
9月12日,13:30,天气晴
讲师所画图的寓意是:人生是进进出出的!我思索半天发现确实是!例如职场中‘公司’这个基本单位,就是一个进进出出的过程,员工的进进出出,财务的进进出出……如图4-4所示。
图4-4 公司的进进出出
我:“数据输入就是向计算机发送数据,输出就是从计算机输出数据显示给用户!”
KNOWALL:“你的解释虽然很笼统,但是意思差不多!这里的输入输出是以计算机为主体而言的,即在计算机内的输入和输出。例如从计算机向外部输出设备(显示器、打印机和磁盘)输出数据称为‘输出’;而从外部设备(例如键盘、扫描仪、磁盘和光盘等)向计算机输入数据,则被称为‘输入’。”
在C语言中,所有的数据输入/输出操作都是由库函数完成的。在C标准函数库中提供了一些输入和输出函数,这些函数都以标准的输入输出设备为输入输出对象。在使用C语言库函数时,要用预编译命令“#include”将有关的“头文件”包括到源文件中。使用标准输入输出库函数时要用到“stdio.h”文件,因此源文件开头应有如下预编译命令:
#include< stdio.h>
或下面的编译命令:
#include"stdio.h"
因为printf和scanf函数的使用频繁,所以系统允许在使用这两个函数时可不用加上面的编译命令。
C语言中常用的输入输出函数有putchar、puts、getchar、printf、scanf、puts和gets等。下面将详细介绍上述输入输出函数的基本知识和使用方法。
4.3.1 putchar函数(字符输出函数)
函数putchar是字符输出函数,其功能是在显示器上输出单个字符。其使用格式如下:
putchar(字符参数)
其中,字符参数可以是实际的参数,也可以是字符变量。
使用putchar函数前必须要用文件包含命令:
#include<stdio.h>
也可以写成如下形式:
#include "stdio.h"
putchar()函数的作用等同于“printf("%c", 字符参数);”,putchar()函数也可以输出整型变量,也可以输出控制字符,并且执行控制字符时执行的控制功能,而不是在屏幕上显示某个字符。例如下面的代码:
putchar('B'); //输出大写字母B putchar(x); //输出字符变量x的值 putchar(‘\101’); //也是输出字符A putchar('\n'); //换行
测试1:通过使用putchar函数来输出指定的字符。
解决思路:我的设计思路如下所示。
(1)分别定义3个char型变量a、b和c;
(2)通过“putchar(a)”在屏幕中输出一个“x”,通过第一个“putchar(b)”在屏幕中输出一个“y”,通过第二个“putchar(b)”在屏幕中输出一个“y”,通过“putchar(c)”在屏幕中输出一个“z”,通过“putchar('\t')”来跳到下一个制表符;
(3)通过“putchar(a);putchar(b);”分别输出一个“x”和一个“y”;
(4)通过“putchar('\n')”进行换行处理;
(5)通过“putchar(b);putchar(c)”分别输出一个“y”和一个“z”。
编写实现文件为“putchar.c”,具体实现代码如下:
#include<stdio.h> void main(){ char a='x',b='y',c='z'; //定义三个字符变量 //输出字符 putchar(a);putchar(b);putchar(b);putchar(c);putchar('\t'); putchar(a);putchar(b); putchar('\n'); putchar(b);putchar(c); }
编译执行后将分别在界面中输出指定的字符,如图4-5所示。
图4-5 输出结果
4.3.2 getchar函数(字符输入函数)
9月12日,14:00,晴
我:“在前面我们已经使用过多次getchar函数了!”
KNOWALL:“对,getchar函数能够获取键盘上输入的字符。”
getchar函数的使用格式如下:
getchar();
在应用中通常把输入的字符赋予一个字符变量,构成赋值语句,例如下面的语句:
char c; c=getchar(); //输入字符并把输入的字符赋予一个字符变量 putchar(c); //输出字符
在具体使用getchar函数时,应该注意如下4点。
(1)使用getchar函数前必须包含文件“stdio.h”。
(2)在TC屏幕下运行含本函数程序时,将退出TC屏幕进入用户屏幕等待用户输入,输入完毕再返回TC屏幕。
(3)getchar函数只能接收单个字符,输入数字也按字符处理。输入多于一个字符时,只接收第一个字符。
(4)程序最后两行可用下面其中的任意一行来代替,例如:
putchar(getchar()); printf("%c",getchar());
函数getchar有一个int型的返回值。当程序调用getchar函数时,程序就等着用户按键。用户输入的字符被存放在键盘缓冲区中,直到用户按【Enter】键为止(回车字符也放在缓冲区中)。当用户按【Enter】键之后,getchar函数才开始从stdin流中每次读入一个字符。getchar函数的返回值是用户输入的第一个字符的ASCII码,如果出错则返回-1,且将用户输入的字符回显到屏幕。如用户在按【Enter】键之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取。也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后才等待用户按键。
测试2:使用getchar函数让用户从键盘输入一个字符,然后将输入的字符输出。
解决思路:我的设计思路如下所示。
(1)定义一个char型变量c;
(2)通过printf输出提示,让用户输入一个字符;
(3)通过“getchar()”获取用户ushuru的字符;
(4)通过“putchar(c)”输出用户ushuru的字符。
#include<stdio.h> void main(){ char c; //声明变量 printf("请输入:\n"); //提示用户输入一个字符 c=getchar(); //接收字符 putchar(c); //输出字符 getch(); }
编译执行后将在屏幕中提示用户输入一个字符,输入并按【Enter】键后将在界面中输出输入的字符,如图4-6所示。
图4-6 输出结果
注意
函数getch与函数getchar基本功能相同,唯一差别是getch直接从键盘获取键值,不等待用户按【Enter】键,只要用户按任意一个键getch就立刻返回。getch返回值是用户输入的ASCII码,出错返回值为-1,输入的字符不会回显在屏幕上。getch函数常用于程序调试中,在调试时,在关键位置显示有关的结果以待查看,然后用getch函数暂停程序运行,当按任意键后程序继续运行。
4.3.3 printf函数(格式输出函数)
9月12日,14:30,晴
我:“为什么叫格式输出函数?”
KNOWALL:“printf函数称为格式输出函数,其中关键字最后一个字母‘f’有‘格式’(format)之意。printf函数的功能是按用户指定的格式,把指定的数据显示到显示器屏幕上。在本书前面的实例中,已多次使用过这个函数。”
1.调用printf函数
printf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。但不要求在使用printf函数前必须包含stdio.h文件。调用printf函数的一般格式如下:
printf("格式控制字符串",输出表列)
其中,“格式控制字符串”用于指定输出格式。格式控制串可由格式字符串和非格式字符串两种组成。格式字符串是以“%”开头的字符串,在“%”后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位数等。例如下面的格式:
● “%d”表示按十进制整型输出;
● “%ld”表示按十进制长整型输出;
● “%c”表示按字符型输出等。
非格式字符串在输出时原样照印,在显示中起到提示作用。“输出表列”中给出了各个输出项,要求格式字符串和各输出项在数量和类型上应该一一对应。
注意
printf函数只能输出字符串,并且只能是一个字符串。在C语言程序项目中,使用最为频繁的就是printf函数。所以在具体使用时,一定要注意不要在printf中输出多行文本。所以在实际应用中,会经常使用多个printf函数语句来实现对多行文本字符的输出效果。
2.格式字符串
在Turbo C中格式字符串的一般格式如下所示:
%[标志][输出最小宽度][.精度][长度]格式字符
其中,方括号“[]”中的项为可选项。
● 格式字符
格式字符用于标示输出数据的类型,各格式字符的具体说明如表4-1所示。
表4-1 格式字符说明
● 标志字符
标志字符有-、+、空格和# 4种,具体说明如表4-2所示。
表4-2 标志字符说明
● 输出最小宽度
用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0。
● 精度
精度格式符以“.”开头,后跟十进制整数。本项的意义是:如果输出数字,则表示小数的位数;如果输出的是字符,则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。
● 长度
长度格式符为h和l两种,其中h表示按短整型量输出,l表示按长整型量输出,可以加在d、o、x和u的前面。
测试3:通过printf格式字符输出指定格式的数据。
我编写实现文件为“printf.c”,具体实现代码如下:
void main() { //声明变量 int a=15; float b=123.456789; double c=12345678.87654321; char d='p'; //按各种格式输出 printf("a=%d,%5d,%o,%x\n",a,a,a,a); printf("b=%f,%lf,%5.4lf,%e\n",b,b,b,b); printf("c=%lf,%f,%8.4lf\n",c,c,c); printf("d=%c,%8c\n",d,d); getch(); }
我:“上述代码好复杂,我不明白什么意思!”
KNOWALL:“我给你讲重点部分吧!第9行中以4种格式输出整型变量a的值,其中%5d要求输出宽度为5,而a的值为15,只有两位,故补上三个空格。第10行中以4种格式输出实型变量b的值。其中%f和 %lf格式的输出相同,说明‘l’符对‘f’类型无影响。%5.4lf指定输出宽度为5,精度为4,由于实际长度超过5。故应该按实际位数输出,小数位数超过4位部分被截去。第11行输出双精度实数,%8.4lf由于指定精度为4位故截去了超过4位的部分。第12行输出字符变量d,其中%8c指定输出宽度为8,故在输出字符p之前补加7个空格。”
编写代码完毕后,按【F2】键将上述文件保存。编译运行后将分别在界面中输不同格式的a和b的值,如图4-7所示。
图4-7 成功提示
在使用printf函数时,还需要注意如下3点内容。
(1)d、o、x、u、c、s、f、e、g等字符在“%”后面就作为格式符号。一个格式字符串以“%”开头,以上述格式字符之一结束,而紧跟在该格式字符串“%”前和格式字符后的字符不会被误认为是该格式字符串的内容。
(2)除了X、E、G外,其他格式字符必须有小写字母,例如“%c”不能写成“%C”。
(3)如果想输出字符“%”,则应该在格式控制字符串中用两个连续的“%”表示,例如:
printf("%f%%",1.0/3);
另外,使用printf函数时还要注意输出表列中的求值顺序。不同的编译系统不一定相同,可以从左到右,也可从右到左。Turbo C是按从右到左进行的。
4.3.4 scanf函数(格式输入函数)
9月12日,15:00,晴
有出必有进,有进必有出!身体还能新陈代谢,生活也是如此。我们为了生活而努力奋斗,获得了献花和掌声,但是在同时失去了很多和家人出去游玩的时间……
我:“看来scanf函数和printf函数是一对,一个实现格式输入,一个实现格式输出!”
KNOWALL:“scanf函数又被称为格式输入函数,能够按用户指定的格式从键盘上把数据输入到指定的变量之中。”
1.scanf函数的格式
scanf函数是一个标准库函数,其函数原型在头文件“stdio.h”中。和printf函数相同,C语言也允许在使用scanf函数之前不必包含stdio.h文件。scanf函数的一般格式如下:
scanf(“格式控制字符串”,地址表列);
其中,“格式控制字符串”的作用与printf函数相同,但是不能显示非格式字符串,即不能显示提示字符串。地址表列中给出各变量的地址。地址是由地址运算符“&”后跟变量名组成的。例如下面的代码中“&a”和“&b”分别表示变量a和变量b的地址:
&a, &b
上述地址就是编译系统在内存中给a和b变量分配的地址。在C语言中地址这个概念与其他语言是不同的,应该把变量的值和变量的地址这两个不同的概念区别开来。变量的地址是C编译系统分配的,用户不必关心具体的地址是多少。
例如在赋值表达式“a=100”中给变量赋值,则a为变量名,100是变量的值,&a是变量a的地址。但在赋值号左边是变量名,不能写地址。而scanf函数在本质上也是给变量赋值,但要求写变量的地址,如&a。这两者在形式上是不同的。&是一个取地址运算符,&a是一个表达式,其功能是求变量的地址。例如下面的代码:
main(){ int a,b,c; printf("input a,b,c\n"); scanf("%d%d%d",&a,&b,&c); printf("a=%d,b=%d,c=%d",a,b,c); }
在上述代码中,因为scanf函数本身不能显示提示串,所以先用printf语句在屏幕上输出提示,请用户输入a、b、c的值。当执行scanf语句后,则退出TC屏幕进入用户屏幕等待用户输入。用户输入“7 8 9”后按【Enter】键,此时系统又将返回TC屏幕。在scanf语句的格式串中由于没有非格式字符在“%d%d%d”之间作输入时的间隔,因此在输入时要用一个以上的空格或按【Enter】键作为每两个输入数之间的间隔。
2.格式字符串
scanf函数的格式字符串和pritf函数类似,以“%”开头,以一个格式字符结束,中间可以插入附加的字符。具体格式如下:
%[*][输入数据宽度][长度]格式字符
其中,方括号“[]”中的项为可选项。上述格式中各选项的具体说明如下。
● 格式字符
格式字符用于标示输出数据的类型,各格式字符的具体说明如表4-3所示。
表4-3 格式字符说明
● “*”字符
“*”字符用以表示该输入项,读入后不赋予相应的变量,即跳过该输入值。例如:
scanf("%d %*d %d",&a,&b);
当输入“123”时,会把1赋予a,2被跳过,3赋予b。
● 宽度
用十进制整数指定输入的宽度(即字符数)。例如:
scanf("%5d",&a);
如果输入“12345678”,将会把12345赋予变量a,其余部分被截去。例如:
scanf("%4d%4d",&a,&b);
如果输入“12345678”,将会把1234赋予a,而把5678赋予b。
● 长度
长度格式符是l和h,l表示输入长整型数据(如%ld)和双精度浮点数(如%lf);而h则表示输入短整型数据。在使用scanf函数时,还必须注意以下6点。
(1)在scanf函数中没有精度控制,例如“scanf("%5.2f",&a);”是非法的。不能企图用此语句输入小数为两位的实数。
(2)scanf中要求给出变量地址,如给出变量名则会出错。如scanf("%d",a);是非法的,应改为scnaf("%d",&a);才是合法的。
(3)在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可按空格、Tab或Enter键作间隔。C编译时如果遇到空格、Tab、回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时,即可认为该数据结束。
(4)在输入字符数据时,如果格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。
例如:
scanf("%c%c%c",&a,&b,&c);
如果输入为“d e f”,则会把d赋予a,空格赋予b,e赋予c。只有当输入为“def”时,才能把d赋于a,e赋予b,f赋予c。如果在格式控制中加入空格作为间隔,例如:
scanf ("%c %c %c",&a,&b,&c);
则输入时各数据之间可加空格。
(5)如果格式控制串中有非格式字符,则输入时也要输入该非格式字符。例如:
scanf("%d,%d,%d",&a,&b,&c);
其中用非格式符“,”作间隔符,所以输入时应为“5,6,7”。
(6)如输入的数据与输出的类型不一致时,虽然编译能够通过,但结果将不正确。
测试4:通过scanf函数输出用户输入字符的ASCII码和对应的大写字母。
解决思路:我的设计思路如下所示。
(1)定义3个char类型的变量a、b和c;
(2)通过printf输出提示,提示用户输入3个小写字母;
(3)通过scanf将用户输入的数据存储到指定变量中;
(4)输出对应的3个大写字母和ASCII码。
本实例的实现文件为“Outputs.c”,具体实现代码如下:
void main(){ char a,b,c; //声明3个字符变量 printf("请输入3个字符!\n"); scanf("%c,%c,%c",&a,&b,&c); //输入3个字母 //输出三个字符以及它们的大写字母 printf("%d,%d,%d\n%c,%c,%c\n",a,b,c,a-32,b-32,c-32); getch(); }
编写代码完毕后,按【F2】键将上述文件保存。编译运行后将在界面窗口中提示输入指定格式的字符,并输入对应结果,如图4-8所示。
图4-8 执行结果
4.3.5 puts函数(字符串输出函数)
9月12日,15:30,晴
我:“还是puts函数的功能强大,能够输出字符串!”
KNOWALL:“puts函数的头文件是stdio.h,其功能是向标准输出设备写字符串并自动换行,直至接受到换行符或EOF时停止,并将读取的结果存放在str指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为null值,并由此来结束字符串。”
puts函数的使用格式如下:
puts(字符串参数)
其中,“字符串参数”可以是字符串数组名或字符串指针,也可以是字面字符串,并且该字符串参数可以包含转义字符,但是不能包含格式字符串。
在使用puts函数时应该注意如下3点。
(1)puts函数只能输出字符串,而不能输出数值或进行格式变换;
(2)可以将字符串直接写入到puts函数中;
(3)puts函数可以无限读取,不会判断上限,所以程序员应该确保str的空间足够大,以便在执行读操作时不发生溢出。
测试5:通过puts函数输出指定的字符串。
解决思路:我的设计思路如下所示。
(1)通过puts函数输出一个句子;
(2)在puts函数中使用换行符输出一个句子。
编写实现文件为“string.c”,具体实现代码如下:
#include <stdio.h> void main(){ //输出输字符串 puts("这是第一行!\n这是第二行!"); puts("这是第三行!"); getch(); }
通过上述代码,分别输出了main函数中的字符语句。好了,开始测试!按【F2】键将上述文件保存。运行后将在界面中输出指定的字符语句,如图4-9所示。
图4-9 执行结果
4.3.6 gets函数(字符串输入函数)
9月12日,15:50,晴
我:“看来gets函数和puts函数也是一对,一个能够输入字符串,一个用于输出字符串!”
KNOWALL:“gets函数的功能是,从标准输入设备(stdin)键盘上,读取一个字符串(可以包含空格),并将其存储到字符数组中去,并用空字符(\0)代替s的换行符。gets()读取的字符串,其长度没有限制,编程者要保证字符数组有足够大的空间,存放输入的字符串。如果调用成功,则返回字符串参数s;如果遇到文件结束或出错,将返回null。”
我:“从功能上看,gets函数和scanf函数功能类似。”
KNOWALL:“两者是有区别的,gets函数输入的字符串中可以包含空格,而scanf函数则不能。”
gets函数的使用格式如下:
gets(字符数组)
测试6:先询问用户的姓名和分数,然后通过gets函数获取输入的信息,通过puts函数输出对应的信息。
解决思路:我的设计思路如下所示。
(1)声明两个字符串str1和str2;
(2)提示输入名字;
(3)通过gets(str1)获取输入的数据;
(4)通过puts(str1)输出数据;
(5)通过puts提示输入成绩;
(6)通过gets和puts输出输入的成绩。
编写实现文件“get.c”,具体实现代码如下:
#include <stdio.h> void main(){ char str1[24], str2[2]; printf("输入你的名字!\n"); gets(str1); //等待输入字符串直到回车结束 puts(str1); //将输入的字符串输出 puts("输入你的成绩!"); gets(str2); puts(str2); getch(); }
编译运行后先在窗体内提示输入名字和成绩,并在界面中输出指定的字符语句,如图4-10所示。
图4-10 执行结果
4.4 解决问题
9月12日,16:00,多云
此时我已经明白了培训讲师所画的那张图的寓意了:在自己的舒服区里的东西对自己至关重要,我的房子、我的家庭、我的朋友,还有我的工作。在这个圈子里,我会觉得特别自在、安全,远离危险和争端。但是人要一辈子待在这个圈子里吗?当然不会!当我离开舒服区以后,我学到了以前不知道的东西,增加了自己的见识,这样我才能进步。如果一个人老是在自己的舒服区里头打转,将永远无法扩大自己的视野,无法学到新的东西。只有当跨出舒服区以后,才能使自己人生的圆圈变大,你才能把自己塑造成一个更优秀的人,如图4-11所示。
图4-11 跨出舒服区
我:“呵呵,人生的进进出出,就像C语句一样有输入也有输出!”
KNOWALL:“下面回到本章开始的问题:尝试输出不同格式变量a和b的数据。”
我:“现在看来问题就简单多了!我可以使用printf函数来实现。”
编写实现文件“question.c”,具体实现代码如下:
void main() { int a=88,b=99; //声明两个变量 //按不同的格式输出各变量 printf("%d %d\n",a,b); printf("%d,%d\n",a,b); printf("%c,%c\n",a,b); printf("a=%d,b=%d",a,b); getchar();
KNOWALL:“能解释一下吗?”
我:“因为格式控制串不同,所以输出的结果也不相同。其中第4行的输出语句格式控制串中,两个格式串%d之间加了一个空格(非格式字符),所以输出的a和b的值之间有一个空格。第5行的printf语句格式控制串中加入的是非格式字符逗号,因此输出的a和b的值之间加了一个逗号。第6行的格式串要求按字符型输出a和b值。第7行中为了提示输出结果又增加了非格式字符串。”
编译运行后将分别在界面中输出不同格式的a和b的值,如图4-12所示。
图4-12 成功提示
4.5 我的总结
本章详细讲解了C语句输入和输出的基本知识。表4-4是我的学习时间进度表。
表4-4 时间进度表