C语言无法正常使用scanf怎么回事?

您所在的位置:网站首页 scanf用法求和 C语言无法正常使用scanf怎么回事?

C语言无法正常使用scanf怎么回事?

2022-12-20 08:40| 来源: 网络整理| 查看: 265

这里只解决scanf_s 的问题。其它问题(如果有的话)暂不涉及。

1. 来历

C99标准库中提供的输入函数scanf()有个缺陷:它不检查键盘输入的信息长度是否小于存储信息的缓冲区的长度,从而导致某些难以检查的越界、溢出甚至是代码安全问题。

C11标准库中提供了所谓的“安全函数”,是在C99标准库中的函数名后面加上“_s”后缀。这些安全函数提供了更多的参数,用于指定缓冲区的大小,从而变得“安全”。这类函数有 printf_s(); scanf_s(); sprintf_s(); fscanf_s(); 等等

微软在他的C++编译器中(对,没有写错,是兼容部分C语言标准的C++编译器)提供的这些所谓的安全函数与C11标准并不兼容,详见:

2. 用法

scanf_s() 是一个可变参数函数,原型如下:

int scanf_s(const char * restrict format, ...);

scanf_s的参数用法与scanf相近,除了遇到c, s 和 [ 这三个转换符时要使用一对参数。这一对参数中,第一个参数与scanf相同,而紧随第一个参数之后的第二个参数的类型是rsize_t (C头文件中定义的一个类型,一种实现方式是 typedef size_t rsize_t; ) 用于指定第一个参数所指向的缓冲区可以容纳的元素的数量。

对于题主的情况,第11行应该改为

/* “40”是name数组的最大容量; * 这行代码指定输入最多39个字符,该函数会自动在后面补充一个'\0'字符; * 这样构成一个“长度为39,占用存储空间40字节”的C风格字符串; * 其中name数组是“缓冲区”,与“40”组成一对参数; */ /* 评论中 @泥偶 同学建议不要直接用数值作为参数,是很好的建议 */ /* scanf_s("%s", name, 40); */ scanf_s("%s", name, sizeof(name)); /* 仅限于name为字符数组并且name的定义与本行代码在同一个函数中 */



【本文地址】


今日新闻


推荐新闻


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