scanf中的\n问题

scanf中的\n问题

C程序执行scanf时,会从缓冲区读数据,如果缓冲区是空的,就阻塞住,等待你从键盘输入。输入结束后按回车会执行scanf函数,程序会逐个读取缓冲区的数据,注意,这时会将\n留在缓冲区(缓冲区只剩下\n)。如果后面输入整型即%d,并不会造成影响,因为缓冲区中的\n是字符,并不会被当作%d读入,会被忽略而读取后面的整型数据,而如果后面输入字符型即%c,这时就需要特别注意,因为缓冲区的\n会被当作%c读入,这样就会存在问题。为了解决这一问题,可以用到scanf末尾加\n的方法。

如果给scanf末尾加上\n,\n不表示等待换行符,而是读取并放弃连续的空白字符,你输入结束之后按回车不会结束,无论再输入多少空白字符都会被忽略,要等再接收到一个非空白字符(空格、制表符、回车)的输入后scanf语句才结束。但需要注意的是,最后输入的那个非(空格、制表符、回车)的东西是不会被这个scanf读进来的,而是留在缓冲区中。

所以,务必注意,请小心scanf函数结束时的\n,它会留在缓冲区被下一个getchar()或者scanf("%c",&ch)所读入,但实际上你并不想读入\n。有以下四种方式来解决这个问题:

  1. 用\n过滤scanf结束时的回车。但是注意,最后一个scanf语句不需要\n,因为缓冲区的\n并不会对后续输入造成影响,反而会导致你需要额外输入一个非空白字符作为结束。
  2. 用一个额外的getchar()获取到多余的\n。
  3. 后续的scanf函数中在%c前多加一个空格用来匹配多余的\n。
scanf(" %c"&ch)
  1. 使用fflush(stdin)函数清空缓冲区(慎用,因为有的编译器不支持)。
fflush(stdin);
  • 59
    点赞
  • 197
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

百栗.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值