649-C语言的标准输入输出IO函数

标准输入输出IO函数

在这里插入图片描述

printf和scanf函数

printf输出的内容都跑到控制台来了,就是输出到屏幕上。
scanf就是从键盘来接收数据。

scanf的第一个参数是格式化字符串,我们记得要在第二个参数给变量加上&,给的是变量的地址!!!
在这里插入图片描述
如果我们万一忘了给变量加上取地址符号&,如下所示:
在这里插入图片描述

它也没有问题,编译链接是不会给你报错的,你给input的初始化是0,它就给这个scanf的第二个参数替换为0,把0当做是内存地址。
在这里插入图片描述
也就是,如果你输入了100,它就把100写到0x00000地址里面去了,但是0地址是不能写的,因为我们32位的进程的虚拟地址空间,前128M都是预留的,读都不能读,更别说写了。
在这里插入图片描述

在这里插入图片描述
能运行,但是输入完,回车后挂掉了!!!

在这里插入图片描述
在这里插入图片描述
这里要求输入的是整数,如果我们输入的是字符串:
在这里插入图片描述
因为这个字符串没有办法去转成合法的整数,相当于给input什么都没有写,input打印的是原来的初始化值0

我们还可以一次性接收多个:
在这里插入图片描述
在scanf的时候,我们在第一个参数只写格式化字符就可以了,但是我们平常在printf打印的时候,会给第一个参数格式化字符串添加一些描述,打印的更清楚一些。
在这里插入图片描述
格式化字符最终会替换成我们右边参数的值,其他的(描述)按原样输出
在这里插入图片描述
输入的时候就不要添加描述性东西了

如果我们这么写:
在这里插入图片描述
在这里插入图片描述
也就是说,scanf没有正确的得到a和b的缓冲区输入的12和23,a和b还是它们的默认值,0xcccccccc
如果一定要按照上面的写法的话,我们在输入的时候就要这么输入
输入的时候要跟scanf里面的格式化字符串里面的格式一样
在这里插入图片描述
在这里插入图片描述
我们可以利用scanf把我们输入的数字或者字符串,解析出来:
在这里插入图片描述
scanf可以输入字符串:
数组名就是数组的首地址
在这里插入图片描述
但是多有不便:
在这里插入图片描述
我们输入了一个带有空格的字符串zhang san,但是缓冲区里却只放了一个zhang
在这里插入图片描述
我们得想其他办法了!!!

我们有专门操作字符串的I/O函数:
专门操作字符串的I/O函数如下:
puts:专门输出一个字符串
gets:专门输入接收一个字符串
putchar:专门输出一个字符
getchar:专门输入接收一个字符

putchar和getchar

在这里插入图片描述
专门输出一个字符的:
在这里插入图片描述
在这里插入图片描述
输入一个字符:
在这里插入图片描述
在这里插入图片描述
输入1个y:
在这里插入图片描述

如果我们输入多个字符:
在这里插入图片描述
只获取第一个字符。
getchar一次只能获取1个字符,但是我们可以通过循环来输入一个字符串。
当ch=‘\n’,也就是遇到回车,循环就跳出,如果不等于回车,说明字符还没有取完,putchar一个一个取出来,直到遇到\n,退出循环。
在这里插入图片描述

puts和gets

puts专门输出一个字符串

在这里插入图片描述

在这里插入图片描述
gets专门输入接收一个字符串
需要两个参数,第一个参数是buffer,第二个参数是buffer的长度
在这里插入图片描述
如果编译器报错,我们这么调整:
在这里插入图片描述
在这里插入图片描述
puts是直接输出的,如果要自定义打印,添加一些描述性的东西(buffer=%s),就得使用printf了
在这里插入图片描述

在这里插入图片描述
gets遇见空格是不会结束的。遇见回车才结束。

扩展提升

在这里插入图片描述
在这里插入图片描述
我们输入12,然后回车
在这里插入图片描述
这么会这样???
在这里插入图片描述
我们没有机会去输入一个名字,这是为什么?
前面输出一个整数数字,后面用gets来接收一个字符串的情况下
当我们输入一个整数:123的时候,实际上,在键盘的输入缓冲区里面还有:\n,残留了一个回车,当scanf用%d的格式化字符,从缓冲区读一个整数,是把123读出来,缓冲区还残留了一个\n,所以到后面gets的时候,从缓冲区直接读了个\n,相当于在这里并没有阻塞住,等待我们用户输入一个字符串,因为缓冲区有内容,它直接把这个回车\n读出来放到name里面
所以,我们看到name里面读出来是空,因为\n是转义字符,没有具体的内容

那怎么处理呢?
尤其是前面是整数,后面是字符串的情况下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林林林ZEYU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值