关于scanf和fflush(stdin)在VS中出现错误的原因

一、scanf在vs中会出现以下错误提示:

不安全的原因是scanf不会进行边界检查,输入的数据可能溢出到其它内存中。VS建议我们用scanf_s替代,带_s的后缀的函数是为了让原版函数更安全。scanf_s还需要提供一个参数,表明最多读取多少个字符。精确的讲,最多读取n-1个字符,因为c语言中c字符串结尾存储一个0(一个字符),即“字符串结束符”。

scanf_s,same as scanf,except that %c,%s and %conversion specifier each expect two arguments(the usual pointer and a value of type rsize_t indicating the size of the receiving array,which may be 1 when reading with a %c into a single char).(引自https://en.cppreference.com

以下为conversion 和specifiers的翻译结果,遇到不会的英文单词就学会。

scanf_s的使用示例:

二、fflush(stdin)在VS中不起作用的解决办法:

我们用scanf_s读取数据时,如果中间没有空白字符(scanf是从第一个非空白字符开始读,读到出现空白字符为止),会读到回车符的前一个字符,所以scanf_s读完后,输入缓冲区会留下一个回车符,这样如果后面继续用scanf没问题,但如果用getline()函数便会出现问题,因为getline()函数是读一行,读到回车符就停止,所以如果写下面这个程序,便会导致第二次无法输入,因为输入缓冲区有数据(\n),正好让getline()读到并结束了读取。

导致的结果是我们无法输入第二个字符串:

所以我们应该在scanf之后清空输入缓冲区:

fflush(stdin)在VS中无效!

我们用下面这两行可以代替fflush(stdin),达到清除那个回车符的效果:

int c;

while((c=getchar())!='\n'&&c!=EOF);

我们来看看getchar这个函数,简单的理解就是getchar从stdin读取下一个字符,如果成功了就返回独到的字符,失败了就返回EOF。不出意外的话,这个回车符就可以被getchar()读走,这里while循环实际上在循环里没有任何操作,起到的作用是:如果没有读到那个回车符,并且也没有发生读取失败,就让程序一直卡在这个空的循环里。

其中,while一句用 while(getchar()!='\n');也可。

简单的情况下,我们甚至直接用getchar()也能达到目的。

参考资料:

VS2013 scanf_s引起 msvcr110d.dll xxxxxx处有未经处理的异常

gcc下fflush(stdin)无效的解决

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值