c语言常用输入函数使用细节

C语言常用输入函数有很多,这里主要讲解以下几个:

1.      scanf():   

        从缓冲区读取键盘输入,遇见回车或空格结束,并将回车或空格留在缓冲区

函数弊端:将垃圾数据(空格、回车、tab键)遗留在缓冲区,当需要连续使用scanf 输入字符时,会导致下一个输入函数读取到缓冲区的垃圾数据,从而导致第二次从键盘读取失败。举例如下:

这里键盘输入 a空格b回车结束后,第一个字母a打印出来了,第二个字母变成了空的,这就是第一个scanf读取完a之后,将空格保留在了缓冲区中,第二个scanf直接就接收了缓冲区中的空格字符,所以word2接收的是空格,后续打印ASSCII码值得以验证。

这里输入 a回车就直接结束了,原因还是一样回车为结束符,然后下一个scanf读取了缓冲区的 \n不难看出,这里自动换行了,且通过打印ASSCII码也能值得以验证。

注意:scanf只有在读取字符时需要考虑换行符问题。

2.     int  getchar(void):   

        从缓冲区读取一个字符

解决scanf的弊端可以使用getchar()函数,该函数也是从缓冲区读取内容,一次只读取一个字符,所以可以在scanf后跟一个getchar()解决字符串问题。举例如下:

图中有连续输入,当输入一个 n 和 回车 后,程序直接结束了,fgets自然而然接收了缓冲区遗留下来的 \n , 所以当我们在使用scanf函数并且需要连续输入时,在每一次使用完scanf后,需要用getchar() 吃掉脏数据后, 才能继续从键盘读取。

如图,这样就能正常两次输入了。

 3.       gets函数具有不安全性,不建议使用,这里不做讲解,具体可参考:

二维字符数组的三种输入方式浅析(scanf()、gets()和fgets())_二维数组怎么输入-CSDN博客

4.     char*  fgets(char *s, int size, FILE *stream);

        参数1:读取内容的存放容器

        参数2:读取大小

        参数3:从哪里读(从键盘读取填stdin)

        返回值:读取成功返回读取到内容的指针,失败返回-1

一般用于读取文件内容,也可读取键盘输入

函数弊端:遇见回车结束,将 \n 一起存进输入的字符串中最后加上\0 结尾,例如从键盘输入的abcd, 实际字符串为 abcd\n\0 ,对于需要对输入数据进行精确处理的程序,这样会导致一些错误,所以我们一般在实际开发中使用时,务必去除最后的换行符。以下是例子:

 图中可以看到,通过fgets从标准输入中读取hello,按回车结束,打印函数返回的字符串, 在没有添加换行符的情况下,自动换行了。那么下面我们手动将换行符去掉,看看效果。

可以看出我们将字符串的最后一位字符改为 \0 后,再次打印字符串中的换行消失了。

总结

scanf()函数输入字符串时,有脏数据遗留在缓冲区

getchar()  用于吃掉脏数据

fgets() 输入字符串时,字符串末尾将携带有回车符缓冲区清空

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值