scanf函数

scanf函数

一、函数

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

函数的原型为:

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

函数的第一个参数是格式化字符串,它指定了输入的格式,并按照格式说明符解析输入对应位置的信息并存储于可变参数列表中对应的指针所值位置,每一个指针要求非空,并且与字符串中的格式一一顺次对应。

格式化字符串参考:

补充:%[] 扫描字符集合。


函数返回值为整型。如果成功,返回成功匹配和赋值的个数;如果到达文件末尾或发生读错误,则返回EOF。

如:scanf(“%d%d”, &a, &b);

如果只有a被成功读入,返回值为1;如果a和b都未被成功读入,返回值为0;如果遇到错误或遇到end of file,返回值为EOF。


二、注意事项

  1. scanf的双引号内永远不要加“非输入控制符”。除了“输入控制符”之外,什么都不要加,否则就是自找麻烦,而且对于用户而言,肯定是输入越简单越好。在scanf中,所有的“非输入控制符”都必须要原样输入;
  2. 参数的个数一定要对应。无论在顺序上,还是在个数上,一定要一一对应;
  3. 输入的数据类型一定要与所需要的数据类型一致,对于输入的数据类型是用户输入的,所以在写程序时要考虑容错处理;
  4. 在使用scanf之前使用printf提示输入,可以大大提高代码的质量。

三、实战

1. 警告 C6031 返回值被忽略:“scanf”。

原因:参考scanf函数返回值。

解决方案:

(1)采用以_s结尾的安全版本(推荐);

(2)根据scanf函数返回值判断用户输入是否合法,作出相应处理。


2. 错误 C4996 ‘scanf’:This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

原因:这种微软的警告,主要因为那些C库的函数,很多函数内部是不进行参数检测的(包括越界类),微软担心使用这些会造成内存异常,所以就改写了同样功能的函数,改写了的函数进行了参数的检测,使用这些新的函数会更安全和便捷。关于这些改写的函数不用专门去记忆,因为编译器对于每个函数在给出警告时,都会告诉相应的安全函数,查看警告信息就可以获知,在使用时也在查看一下MSDN详细了解。

解决方案:

(1)采用以_s结尾的安全版本(推荐);

(2)在头文件包含的最前面(在include的前面)加上:#define _CRT_SECURE_NO_WARNINGS;

(3)在头文件包含的最前面(在include的前面)加上:#pragma warning(disable:4996);

(4)通过以下步骤:调试->属性->C/C++->预处理器->预处理器定义->编辑->输入“_CRT_SECURE_NO_WARNINGS”->确定。

(4)第一、二步
(4)第三、四、五、六步
(4)第七、八、九步

编辑于 2019-12-11 14:12