处理警报

编译器:Microsoft Visual Studio 2010

任务是编译简单的代码,要求计算键入的两个整数的和,代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	int num1 = 0;
	int num2 = 0;
	int sum = 0;
	scanf("%d%d",&num1,&num2);
	sum = num1+num2;
	printf("sum = %d\n",sum);
	return 0;

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

一段十分简单的代码,但是在屏蔽了#define _CRT_SECURE_NO_WARNINGS这一句代码之后再使用scanf函数就会有这样的warning:

警告	1	warning 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.	d:\learn\c_learning\test_2_29\test_2_29\test.c	10	1	test_2_29
  • 1.

警报原因:输入的函数是不安全的。例如在通常使用“scanf”时,我们并没有对将要放入的数据所占用的空间进行检测(可能出现数据越界),因此这样是不够安全的。

解决这个问题的方法有两个:1.将scanf函数换成scanf_s函数;2.在源代码开头加上这行代码:#define _CRT_SECURE_NO_WARNINGS

解析:scanf是C语言提供的,scanf_s并不是标准C语言提供的,是VS编译器提供的。若使用scanf_s会影响代码的可移植性,推荐使用第二种方法。

后续可能还会用到其他函数例如strcpy,strlen,strcat等,也会出现这个警报,解决办法是一样的。(C语言提供的函数可能有一些是不安全的,需要程序员自己去规避这些坑,但是使用编译器提供的安全函数会降低代码的可移植性)


变量的分类
局部变量

放在一个代码块{}内部的变量,作用域是该代码块。只能在此代码块内生效,局部变量的生命周期是该代码块从执行开始到结束。当局部变量和全局变量同名的时候,局部变量优先使用。并不是所有的局部变量都放在main函数中,但是放在main函数中的变量都是局部变量。

全局变量

放在{}外的变量称为全局变量,作用域是整个工程。全局变量的生命周期是整个程序的生命周期。


常量

C语言中的常量分为以下几种:

  1. 字面常量:即直接写出的常量/值
  2. const修饰的常变量:在定义变量时在前面键入const,会使该变量变为常变量,不可对该变量进行二次赋值。const意为常属性。注意被const修饰的变量本质上仍然是变量,它只是具有了常属性而不能改变。
  3. #define定义的标识符常量:#define定义常量往往在源文件的最开始,main函数之外,属于全局常量。
  4. 枚举常量:枚举即一一列举,例如性别,三原色等。枚举关键字enum。枚举关键字定义的枚举常量不可以更改,但是通过枚举类型所创建的变量可以更改。


字符串+转义字符+注释
字符串

字符串类型,由双引号引起来的一串字符。注:字符串结束的标志时一个\0的转移字符。在计算字符串长度的时候\0时结束标志,不算做字符串内容。数据在计算机上存储的时候存储的是二进制,字符存储时遵循ASCII表。A~Z对应的十进制65~90,a~z对应的十进制97~122.