scanf

您所在的位置:网站首页 scanf_s字符输入 scanf

scanf

2023-03-14 05:55| 来源: 网络整理| 查看: 265

scanf_s 和 scanf 几乎是一样的,但是 scanf_s 在字符串的读入上有不同,允许在参数中指定读入字符串的长度上限,以避免读入的内容长度超过已有的内存空间的长度。

比如,如果我们这样写:

char word[10]; scanf("%s",word);

然后运行的时候输入了一个这样的字符串:

tooyoungtoosimplesometimesnaive

那么这么长的字符串就会全部填在 word 数组里,超过它的长度,这样会出偏差的。

为了避免出现这样的偏差,scanf_s 允许你指定读入串的长度上限,于是我们改成下面这样:

scanf_s("%s",word,(rsize_t)sizeof word);

这样输入过长时就会产生错误,执行你之前在 set_constraint_handler_s 中定义的错误处理函数(如果你没有定义的话,系统会给你准备一个,也许是直接忽略,也许是直接停止运行),你的程序就不会在这里搞出什么偏差。

而且,如果你传入的参数有空指针的话,也会产生错误,执行你定义的错误处理函数。

也就是说,使用 scanf_s 比使用 scanf 要更安全。

不过,并不是所有的标准库都实现了 scanf_s,你可以通过检测 __STDC_LIB_EXT1__ 是否被 #define 了,检测标准库是否支持,然后在代码最前面加上下面这一行:

#define __STDC_WANT_LIB_EXT1__ 1

来开启标准库对于 scanf_s 以及其他一些函数的更安全的版本(比如 strcpy_s memset_s 之类的)的支持。

这是 C11 新增的内容。

如有错误,请指出。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3