C语言scanf_s()函数的用法

前言

今天开始学习C语言,看书学的挺快的,感觉很有趣,就想着敲下代码,结果错误百出,差点不想学了,果然编程是会的。下面说说第一个程序遇到的问题与心得

scanf_s()前身——scanf()

有的教材里用的scanf(),其实在目前Visual Studio版本中已经弃用了,用scanf_s()函数代替了。scanf()既然已经被替代了我就不多说了。

为什么现在要用scanf_s()?

scanf_s()函数是Microsoft公司VS开发工具提供的一个功能相同的安全标准输入函数,从vc++2005开始,VS系统提供了scanf_s()。在调用该函数时,必须提供一个数字以表明最多读取多少位字符。另外,很多带“_s”后缀的函数是为了让原版函数更安全,传入一个和参数有关的大小值,避免引用到不存在的元素,防止hacker利用原版的不安全性(漏洞)黑掉系统。简单的理解,就是scanf_s会比scanf更安全,那么为了安全也需要编程者多传一些参数,这些参数就是变量的长度(占用的字节数)。(摘自ID“自信男孩"的解答)
很多带“_s”后缀的函数是为了让原版函数更安全,传入一个和参数有关的大小值,避免引用到不存在的元素,有时黑客可以利用原版的不安全性黑掉系统。比如:char d[20];写成scanf_s("%s",d,20);才是正确的,有这个参数20使准确性提高。(百度百科)

scanf_s()简介

微软MSDN上简单的函数原型为int scanf_s( const char *format [, argument]...);
看不懂没关系,我也不懂。
参数类型可以是%d %f %c等等
函数的返回值: 函数是int型,返回一个整型,该整型值就是scanf_s()函数所输入的个数,现在设定为result,后文代码演示就明白了

如何使用scanf_s()

直接上代码,简单易懂

int    i,b;
int result;//函数返回值
scanf_s("%d ", &i);
scanf_s("%d %d", &i, &b);
result=scanf_s("%d %d", &i, &b);//运行结果为2,因为输入了两个数,一个a,一个b

但是输入字符的时候,scanf_s()的安全性就体现出来了

char     c,  s[80];
scanf_s("%c %s ,  &c, 1,s,80);   //字符c输入1个,c后面跟1,s字符数组80个,所以s后面加80。

这就是两个函数的区别之处了。
注意注意:如果是

char buf[5];
scanf_s("%s",buf,5);//表示最多读取4个字符,因为buf[4]要放'\0'

切记键盘输入是要少敲一位字符,因为数组最后一位要放结束符,这个百度数组的用法就清楚了。
我调试代码发现了,例如当我输入"abcde"时,buf字符数组里出错没有任何东西
调试情况
只有输入四个字符时才正确。
我就不说其他的了,也不放代码,刚开始一定要自己多敲一敲。

键盘响应输入的问题

第一种情况:
当我们scanf_s("%d%d%d",a,b,c);
如果你在键盘上输入了1 2 3(1空格2空格3),那么第一个空格就被当作字符了。要用回车,用回车,用回车。
第二种情况:
当我们scanf_s("%d,%d,%d",a,b,c);
这个时候我么就需要用逗号隔开,比如想给a输入1,b输入2,c输入3。键盘的按键顺序就是:1 逗号 2 逗号 3 Enterr
(逗号代表逗号键)。

结束语

好累啊,写博客心好累,主要是花太多时间了,自己还是个初学者,写的内容不深,我还是少写点基础的,写高深点的吧。如果想探讨C/C++学习,欢迎加入C/C++学习交流群:903829347

  • 272
    点赞
  • 477
    收藏
    觉得还不错? 一键收藏
  • 21
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值