C语言scanf_s()函数的用法

Posted 墨梅C

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于C语言scanf_s()函数的用法的主要内容,如果未能解决你的问题,请参考以下文章

C++ scanf_s()函数的用法以及注意事项

C 语言数组 ( 指针数组用法 | 自我结束能力 )

c语言,gets函数的详细用法?

C语言杂谈scanf()scanf_s()与错误 C4996

关于scanf的用法

求教c语言中fgets的用法