【答疑释惑】C语言中 scanf_s和 scanf 区别是什么?

今天的答疑解惑语音版:

1 scanf:

与printf函数一样,都被定义在头文件stdio.h里,因此在使用scanf函数时要加上#include <stdio.h>。它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。

int scanf(const char *format,...);

函数 scanf() 是从标准输入流stdio (标准输入设备,一般是键盘)中读内容的通用子程序,可以说明的格式读入多个字符,并保存在对应地址的变量中。

其调用形式为: scanf("<格式说明字符串>",<变量地址>);变量地址要求有效,并且与格式说明的次序一致。

2 scanf_s

很多带“_s”后缀的函数是为了让原版函数更安全,传入一个和参数有关的大小值,避免引用到不存在的元素,有时hacker可以利用原版的不安全性黑掉系统。比如:char d[20];写成scanf_s("%s",d,20);才是正确的,有这个参数20使准确性提高。

ANSI C中没有scanf_s(),只有scanf(),scanf()在读取时不检查边界,所以可能会造成内存访问越界,例如分配了5字节的空间但是读入了10字节。

  1. char buf[5]={'\0'};
  2. scanf("%s", buf);
  3. 如果输入1234567890,后面的部分会被写到别的空间上去。
  4. 以上代码如果用scanf_s,第二行应改为scanf_s("%s",buf,5),表示最多读取4个字符,因为buf[4]要放'\0'

scanf_s最后一个参数是缓冲区的大小,表示最多读取n-1个字符。

vc++2005/2008中提供了scanf_s(),在最新的VS2013中也提供了scanf_s()。在调用时,必须提供一个数字以表明最多读取多少位字符。

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-07-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python小屋

Python花式编程案例集锦(5)

问题描述: 输入三个序列,例如:[0.9,0.5,0.7],[0.4,0.6,0.3],[0.5,0.2,0.4],输出三个序列中各取一个相乘后最大的值,以及组...

2575
来自专栏数据结构与算法

35:输出二进制补码

35:输出二进制补码 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB描述 输入一个整型(int)的整数,输出它的32位二进制补...

3258
来自专栏信安之路

php 不用字母,数字和下划线写 shell

还有这个师傅的 《记一次拿webshell踩过的坑(如何用PHP编写一个不包含数字和字母的后门)》

691
来自专栏郭耀华‘s Blog

TensorFlow 使用变量共享

TensorFlow中的变量一般就是模型的参数。当模型复杂的时候共享变量会无比复杂。

581
来自专栏Python疯子

python数据清洗

数据的质量直接关乎最后数据分析出来的结果,如果数据有错误,在计算和统计后,结果也会有误。 所以在进行数据分析前,我们必须对数据进行清洗。需要考虑数据是否需要修...

722
来自专栏AI科技大本营的专栏

数据科学Python基础(附示例代码和练习题目)

? 翻译 | AI科技大本营 参与 | 王珂凝 审校 | reason_W 【AI科技大本营导读】Python的强大和灵活相信已经毋庸置疑了。那么数据科学中...

3245
来自专栏玄魂工作室

如何学python-第六课 流程控制-IF,ELSE,条件语句

在上一篇文章里,我们介绍了流程控制的概念,并介绍了布尔类型。今天,我们会把上节课学到的东西与 if、else结合起来使用。 条件判断语句 条件判断语句会根据语句...

3288
来自专栏C语言及其他语言

[每日一题]排列

题目描述 有4个互不相同的数字,输出由其中三个不重复数字组成的排列。 输入 4个整数。 输出 所有排列 样例输入 1 2 3 4 样例输出 1 2 3 1 3 ...

3387
来自专栏Crossin的编程教室

【Python 第24课】 if的嵌套

和for循环一样,if也可以嵌套使用,即在一个if/elif/else的内部,再使用if。这有点类似于电路的串联。 if 条件1: if 条件2: ...

2846
来自专栏Aloys的开发之路

ACM竞赛之输入输出(以C与C++为例)

本文转自互联网,内容、排版有修正。 在ACM程序设计竞赛中,一道题目的所有测试数据是放在一个文本文件中,选手将一道题目的程序提交给评判系统运行,程序从该文件中读...

2445

扫描关注云+社区