输入/输出知识了解(入门)

目录

1.序言

2.printf函数

3.scanf函数

4.其它


一.序言

  本篇文章主要是针对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,它是将其转成字符串,存进去我们指定的空间中 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值