关于scanf与scanf_s

今日在输入一个程序时一直改不过来,发现有错误,就是现在下图的情况:

明明已创造了可放入char元素的数组,但是在如图所示的scanf_s一行中,使用%s却无法使程序跑动起来,达不到想要的预期效果。

但是最让人疑惑的是明明该放入%c或者是%s,在放入%d后,程序居然运转了....它居然运转起来了...然后放入%c也可以,为何%s就不可以呢?(学c,从入门到入土)

最后在和别人的讨论(主要是别人教我)后,从历史开始讲起...

scanf是在scanf_s之前出现的,从前用scanf输入函数,现在是用scanf_s来输入函数,以此来避免不检查边界从而导致内存泄露然后程序崩掉。而在scanf_s中,平时输入%d  %f  %lf都没有问题,但在用%s和%c输入字符串或者字符时会进入缓冲区一个一个读取,这时候在scanf_s中就要定义一个缓冲区的边界值,用来防止内存泄露,这个时候有scanf_s的程序才会运行,所以在scanf_s那一行里要用scanf_s("%20s",password,sizeof(password));来做到定义边界值,从而使得有scanf_s的程序运行起来。

 "20s"——定义输入20个字符

sizeof(password)——定义一个缓冲边界值,防止内存泄露。

总结来说,要解决上面的问题,有以下两种方法:

一、将scanf_s改为scanf。

二、将scanf_s一行改为输入scanf_s("%20s",password,sizeof(password));

但仍存在两点疑惑未解决:

一、为何在使用%c时不需要定义边界值?

二、为何在scanf_s一行里使用%d时程序可正常运行?

在以后可以尝试用指针方法来求解,路漫漫~~

上文里还有很多不准确的地方,如果有什么错误或者有大佬能够解答我的疑惑,欢迎大家来讨论。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值