目录
一.序言
本篇文章主要是针对C语言输入和输出的常见函数进行自己的知识总结,加深对知识的理解,主要内容来源于c语言程序设计现代方法这本书和cplusplus这个网站.
二.printf函数
printf函数在C语言中是被用来设计显示格式串的内容
理解printf函数最重要的一点就是理解格式这两个字,我们提供参数,转换说明,然后在对应指定位置输出我们想要输出的值.
1.参数
我们先来看参数部分,参数可以设定为常量,变量,甚至更复杂的表达式都是可以的
而且我们可以发现,上面图片设计函数的时候,是省略号结尾,这意味着调用一次printf函数一次可以打印的值并没有限制!!!
2.对应位置关系
前后一一对应,这个我们都是知道的,在这里我们便不再详谈,但是,假如后面提供的参数,不是一一对应呢?多了或者少了,又会出现什么样的情况呢?
通过自己简单的测试,我们就可以发现,在vs2019IDE下,是完全可以通过,不会报错的
当所拥有的变量值多于需要显示的值,printf函数会显示正确的值,没有对应的值,将会随机显示一个没有意义的整数值,如上图的14946339.
太少,则会正确输出正确的值,没有位置,则不会输出,如上图的j则没有输出.
3.转换说明
这个估计就是我们使用printf函数最头痛的一件事了,给一个变量,如何把它从内部(二进制形式)转换成打印字符的形式,就是我们所说的转换说明.
我们将通过实例,来进一步理解是什么意思
%d 按照十进制输出,且占用最少空间
%5d 按照十进制输出,且占用5个字符的空间,不足就补空格,不加负号,就右对齐,加了负号,就左对齐
%5.3d 同上,但至少有3个数字,所以我们可以发现其自动补了个0,加上40,两个数字,刚好3个数字.
%10.3f 以定点十进制输出数字,小数点后的3说明小数保留3位有效数字,小数点前的10说明占用10个字符的空间
%10.3e 以指数形式显示数字,同样小数保留3位有效数字
%-10g 既可以定点十进制输出数字,也可以指数形式输出,在这种情况下,printf函数选择以定点十进制输出数字,后面还有4个空格,保证总共占位10个字符
4.返回值
在这个程序中,循环条件是恒为真的,因为打印字符数量为1,非0即为真.
三.scanf函数
同printf函数一样,关键在于格式这两个字,scanf函数被用于特定的格式读取输入
1.注意事项
&这个符号放在调用每个变量前面,如果忘记加,会造成的结果往往是程序崩溃,所以一定要小心!!!当然,也不一定要加
像像上面程序,数组名本身就代表字符串首元素的地址,所以这里没有加&,也能够运行程序
2.空白字符
我们把换行符’\n‘,空格’ ‘,水平和垂直制表符,换页符,换行符等等,都归为空白字符.
3.工作方法(模式匹配)
scanf函数是用来从标准输入流(也就是我们的键盘)中读取我们想要的数据,并存储在内存中.
并且按照我们指定的格式串(也就是我们一般前面给的一大堆东西,”%d %d“之类的)进行模式匹配的录入.
具体如何操作呢?我们可以看《c程序现代设计》这本书给出的解释.
有几句话,值得我们细细研究一下.
第一.在数据录入时,对于每一个转换说明,格式串中的空白字符的数量其实无关紧要,格式串中的一个空白字符可以与输入中任意数量的空白字符相匹配,甚至0个也可以匹配.
像下图所示,输入中并没有空格,但完全没有影响格式中空白字符的匹配.
再比如,下面这段程序
我设置的格式字符串中前面有一个空白字符(空格),但我输入的时候,并没有加空格,但我们可以同样成功录入a的值.
这也意味着我们可以把数字放在同一行或者分散在几行内输入.在寻找数的初始位置,scanf函数会忽略空白字符串(包括空格符,换行符等等).
像上图这样输入,是完全ok的,空白字符串会被忽略.
第二.读入数据项,并且在遇到绝对不可能属于此项的字符的时候停止.
接下来,我们依旧将用两个具体实例,来说明这句话什么意思.
(1)非转换说明(此时不会跳过空格,而是一一比对)
看下面这段程序,在格式录入中,/这个字符前面并没有空格,假如输入中自己加了空格,电脑匹配后,发现/和空格不匹配,(此时就是遇到绝对不可能属于此项的字符),那剩下的数据都会被留在缓存区中,等待下一次调用scanf函数来读取,j就会被赋予一个随机值.
(2)转换说明(可以跳过空格,具体看第一条解释)寻找像正负号和小数点,作为划分界线
看下面这段程序,1首先对应第一个%d,然后被录入,scanf函数接着读取下一个字符输入,为’-‘,而’-‘绝对不属于整数,(此时也是遇到绝对不可能属于此项的字符),那剩下的数据都会被留在缓存区中,然后scanf函数继续看下一个格式串中%d,进行下一次匹配.
下面是书中,对该程序的详细解释.
第三,转换说明(也就是%d),像我们第一条中所说,大多数时候,会跳过我们输入中的空白字符,直接去找我们想要的数据.但是转换说明,不会跳过尾部的空白字符.
比如我们输入123’\n‘,\n是不会录入的,而是会被放到缓冲区中,成为下一次调用scanf函数的第一个参数.
注意:格式串中的空白字符不要乱加,比方说我格式串如下图所示,在末尾加了一个空格,那模式匹配的时候,按目前程序结果来看,这个空格依旧是一对多,即便你输入末尾加了空格,它也不会停止,一直到你输入不是一个空白字符时(像下面输入了一个’/‘,或者数字5),才停止匹配.
3.返回值
成功录用多少参数,就返回填充的数目 ,匹配失败,读取错误或者文件末尾的到达,就返回0
因此在oj中需要循环录入,会有下面两种常见的编程方式,两者是等价的
四.其它
1.gets函数,直接录入一个字符串
2.getchar函数,与scanf类似,但它是录用啥,返回啥
3.sprintf函数,格式化录入,但不同于printf,它是将其转成字符串,存进去我们指定的空间中