关于getchar(),scanf(),gets() ~~~~~~~~~~~来自百度知道

问题代码如下:

#include<stdio.h>
main()
{char a1[5],a2[5],a3[5],a4[5];
scanf("%s%s",a1,a2);
gets(a3);gets(a4);
puts(a1);puts(a2);
puts(a3);puts(a4);
}
键盘输入:
aa bb<回车>
cc dd<回车>

问题:为何输出结果是:
aa

bb

cc dd

 

 

注意这点,gets()函数会读取一行字符,直到遇到换行符'\n为止,并且这个换行符不会读取到数组中。

scanf("%s%s",a1,a2);
这一行把aa和bb读取并分别保存到a1和a2数组中,但是会把回车符留在缓冲区中。

gets(a3);gets(a4);
这里的gets(a3)会读取这个回车符,但是不会把回车符保存到a3数组,所以a3数组内容不会改变,接下来的gets(a4)将以回车结尾的cc dd读取并保存到a4

puts(a1);puts(a2);
分别在单独的行中输出a1和a2字符串。puts(a3);puts(a4);
分别在单独的行中输出a3和a4字符串。由于a3没有赋值,所以它依然保持在定义时的随机值。

 

解决方法:

方法1:C语言里提供了函数清空缓冲区,只要在读数据之前先清空缓冲区就没问题了!
这个函数是fflush(stdin)。


                                                    (以下内容是我自己编辑的)

  • scanf() 函数是遇到空白符就停止读入数据。空白符会被留在输入缓存区中。(cin和scanf一样)
  • gets()遇到回车符停止读入数据。回车符会读入到字符数组中,但是,被保存为了 '\0'。
  • 因此,当先用了scanf或者cin之后,再用gets的话,容易出错。因为之前没被scanf和cin读走的空白符还留在输入缓冲区中,而一旦调用gets,gets就会从输入缓冲区中读入这些数据。
  • 这三种输入在被调用时都是直接从输入缓冲区中读取数值,不等键盘按下。
  • 在键盘按下的字符都被保存在输入缓冲区之中。

有不明白的,欢迎在下方留言。 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值