本来这一节是准备放在后面再讲的。不过想了一下。把这一节学完了后你就可以简单的输出输出一些数据了。能够在运行中输入一些数据。你能写出的程序就更多了。
同时,如果把输入输出放在一起讲,未免就有些教科书的意思了,这和本教程所希望的“轻松愉悦”的学习环境相违背。我认为学习应该是螺旋式的。同样的内容在不同的时候将,你将有着不同的收获。因此本节中所讲述的内容,在后面的文章中至少还会提到两次。
说了这么多废话,让我们开始正文。
c语言中,并没有提供输出、输入的语句。因此如果我们需要输入输出一些信息,就需要使用“函数”。
在前面的文章中,我们已经接触到了一些输出信息的方法,比如最开始的hello world
我们使用了一个叫做 printf 的函数
前面已经说道过,printf就是print[打印]+format[格式],也就是格式化打印的函数。
在后面,我们使用到了puts函数,puts就是put string[字符串],从字面上来看,它只可以输出一个字符串
此外,还有一个类似的函数,叫做putchar,这个就不用解释了吧,看函数名就知道它是输出一个字符的意思了(我们以后命名也应该这样,见名知义)
现在,让我们以一个程序为例,学习这三个函数的使用方法。
#include <stdio.h> #include <stdlib.h> int main() { char ch = 'a'; //定义一个名为ch的char型变量,并初始化字符a int a = 10, d = 0; //定义名字分别为a和d的int型变量,初始化为10,0 double i = 5.5; //定义一个名为i的double变量,初始化为5.5 float j = 6.23f; //定义一个名为j的float变量,初始化为6.23 printf("ch= '%c'\n", ch); //以ascii输出ch的值 printf("a=%d,d=%d\n", a, d); //输出a和d的值 printf("i=%lf\n", i); //输出i的值 printf("j=%f\n", j); //输出j的值 return 0; }
请先复制到编辑器中,并编译运行
程序中的注释应该已经告诉了你很多信息。
程序的前两行都是include,因为我们使用的输出函数是别人已经写好了的,所以我们需要告诉编译器这些函数在哪儿,长什么模样
第四行定义了一个main函数,程序将从这里开始执行
6-9行是一些变量的定义如果你前面的文章已经看懂了的话,为打赌你知道这些是什么东西。
只有一点需要说的是,在计算机中,浮点型常数都是double类型的,所以如果给float型变量赋值的话,可以在数字后面加上f,告诉编译器这是一个float型的浮点数
但是其实不写也行,编译器会自动转换,不需要我们瞎操心
我们所需要学习的东西从第11行开始。
printf后面跟着一个括号,括号内的东西叫做“参数”,我们想让函数干些什么,需要告诉它一些信息。这些信息可以通过参数来传递给我们所调用的函数(具体将在后面学习)
参数之间是用逗号隔开的,也就是说下面这句
printf(“ch= ‘%c’\n”, ch);
它有两个参数,一个是前面的字符串常量“ch= ‘%c’\n”,这个叫格式控制参数
另一个是后面的ch,这是一个字符型变量。
如果你运行了程序,你将发现,字符串常量中的ch=显示出来了,但是后面的’%c’\n呢
反倒是后面变量ch的值显示出来了,并且好像占据的是%c的位置
没错,就是这样。
在printf中,像这样以%开头,后面跟一个字符的东西,叫做占位符。
它会占住一个位置,说明这里的信息等待填充。
就像你在图书馆占座位,扔一本书上去,告诉别人:这里的位置已经有人占了。但是具体是谁占了呢?我们不一定知道,只有等这个人回来我们才知道是谁。占位符这个位置上的内容,也只有我们输出之后才知道它具体是什么
在printf函数往屏幕上打印字符的时候,占位符的位置将被后面变量中的内容填充。
你可能还会问,那\n在哪儿去了?
转义字符呀!这是一个换行符,当然就是换行了。
现在请你删去第一个printf后面的\n,再编译运行,你将发现区别
那么%c后面的c又是干嘛的?
因为数据在计算机看来,是无差别的。因此我们需要告诉printf,我们输出的这个变量是什么类型的。计算机很笨,但是它很听话,c就是告诉printf,这里应该输出一个字符类型。
往后看,12行中输出了两个整型数据,占位符是%d,你应该猜到d就是告诉printf,这里是一个整型数字了。
但是因为有两个变量需要我们输出,所以这个printf有三个参数
前面一个还是格式参数,它告诉printf应该按照怎样的格式输出,后面就是我们需要输出的两个变量,a和d。printf至少要有一个参数,就是前面的格式参数,后面的变量叫做输出列表,你可以写很多个变量,它的数量会根据前面的格式控制参数而改变
这一次的格式控制参数中,有两个占位符,可以看出,占位符的顺序和后面输出列表中数据的顺序是相同的,如果我们颠倒了后面的参数顺序,printf还是会按照我们规定的格式输出,也就是说会显示a=0,b=10。请尝试
后面两行的printf应该很好理解了。%f是输出float变量,lf(long float)则是double。
下面的这张表中,说明了%后面所接字符代表的含义(部分)
字符 | 对应的数据类型 | 含义 |
d / i | int | 接受整数值并将它表示为有符号的十进制整数,i是老式写法 |
o | unsigned int | 无符号8进制整数(不输出前缀0) |
u
|
unsigned int | 无符号10进制整数 |
x / X
|
unsigned int | 无符号16进制整数,x对应的是abcdef,X对应的是ABCDEF(不输出前缀0x) |
f(lf)
|
float(double) | 单精度浮点数用f,双精度浮点数用lf |
e / E
|
double | 科学计数法表示的数,此处”e”的大小写代表在输出时用的“e”的大小写 |
g / G
|
double | 使用以上两种中最短的形式,大小写的使用同%e和%E |
c
|
char | 字符型。可以把输入的数字按照ASCII码相应转换为对应的字符 |
s / S
|
char * | 输出字符串 |
%
|
无输入 | 不进行转换,输出字符‘%’(百分号)本身 |
因为我们现在还没有学“字符串变量”,所以基本上用不到字符串输出的情况
等到了后面我们学了如何保存字符串,我们再来学习printf的使用
putchar和上面相比,就简单多了,你只需要
putchar(ch);就可以将ch输出
请自己在程序中添加这一句,并观察结果
puts和putchar的用法相似,但是因为字符串还没有学,故放到后面再讲。
最后留一个实验,请用整型的方法输出char类型变量,并对比ascii表,看看有什么发现
一定要做哦