69,369
社区成员
发帖
与我相关
我的任务
分享
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 新增的内容。scanf_s("%s", name, 40);
scanf_s使用时缺少参数,详细的请查阅一下scanf_s的原型