迟迟到来的第二篇(vs2019中scanf报错)

这篇博客的重点是解决vs2019环境下scanf函数的用法,,,,

scanf是C语言提供一个输入函数,具体用法是

int main()
{
	//2个整数的相加
	int num1 = 0;
	int num2 = 0;
	
	//输入2个值
	scanf("%d %d", &num1, &num2);
	//计算
	int sum = num1 + num2;
	//打印-输出
	printf("%d\n", sum);

	return 0;
}

&取地址符号,上一篇说到创建变量的时候是在内存中创建一个空间,比如上面代码的int num1;就是在内存中创建了4个字节的空间并命名为num1,而‘&’这个符号就是取到这个空间的位置,把我们输入的数据放进这个空间。

相信好多小伙伴在vs2019使用这个函数的时候都会报错,现在我来解释一下, 

报错中提示了两种解决方法,一种是在scanf后面再加一个_s,第二种是在头文件前加一段宏定义的代码。

报错中讲到的scanf_s的函数是VS编译器提供的,不是C语言自己的
在其他的编译器(gcc,clang)下就没scanf_s的函数,也不认识这个函数
当你在代码中使用了scanf_s函数,你的代码在其他的编译器下就没法正确的编译,这就降低了代码的跨平台性
所以我们建议写代码时尽量使用标准C提供的功能和函数,所以我们使用第二种方法。

在头文件前加上#define _CRT_SECURE_NO_WARNINGS 就可以解决这个问题。

但问题又来了,我们每次在写代码之前都要打这么一串代码特别麻烦,这时候又有一个解决办法

迟迟到来的第二篇(vs2019中scanf报错)_第1张图片

找到这个文件,打开后把#define _CRT_SECURE_NO_WARNINGS 粘贴上去,如果不能粘贴,就打开路径

迟迟到来的第二篇(vs2019中scanf报错)_第2张图片

 然后把他在所在文件夹里拖到桌面在编辑,然后再拖回去。这样下次创建新项目上面就自动有那一行代码了。scanf这个问题就解决了。(我用的是一个叫everything的软件,可以快速找到任意文件)

上一篇我说到变量分为局部变量和全局变量,现在我从变量的作用域和生命周期开始~~

定义域:

1. 局部变量的作用域是变量所在的局部范围。 这里注意了,是变量所在的局部范围,并不是一定要在main函数里

2. 全局变量的作用域是整个工程。比如在所有函数外面声明的变量,在所有函数内都能使用。

生命周期:

1. 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。进入局部变量所在的范围,生命周期开始,出局部变量所在的范围的时候,生命周期结束

2. 全局变量的生命周期是:整个程序的生命周期。

常量

1,字面常量

就是字面上的常量,直接在函数内出现的常量如:100;3.14;‘w’;

2,const修饰的常变量

虽然下面的num是不能修改的,但是本质上还是一个变量

#include
int main()
{
    const int num = 10;
    printf("num = %d\n", num);//10
    num = 20;
    printf("num = %d\n", num);//20
    return 0;
}

在C99之前的标准中,数组的大小并不能用变量来指定,这时候,我们即便用const定义了常变量也是不行的,因为它本质上还是一个变量。

3,#define 定义的标识符常量

一般我们用大写,如#define MAX 100

4,枚举常量

 枚举就是一一列举,生活上有好多值都适合一一列举,

#include
//定义枚举类型
enum Sex
{
	//枚举这种类型的可能取值 - 就是枚举常量
	MALE,
	FEMALE,
	SECRET
};


int main()
{
	//enum Sex s = MALE;
	printf("%d\n", MALE);
	printf("%d\n", FEMALE);
	printf("%d\n", SECRET);
	//MALE = 10;//ERR

	return 0;
}

迟迟到来的第二篇(vs2019中scanf报错)_第3张图片

每个枚举常量都有自己的值,枚举常量不能被改变。默认是从0开始,依次向下递增1. 

字符串+转义字符+注释

字符串:这种由双引号引起来的一串字符称为字符串字面值,或者简称字符串。

注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。

这里引入strlen函数,是用来求字符串长度的函数,它包含在string.h头文件里,所以这里我们有两个头文件。

#include 
#include 


int main()
{
	可以把字符串放在字符数组中
	char ch = "abc";//err
	char arr1[] = "abc";
	char arr2[] = {'a', 'b', 'c', '\0'};

	printf("%d\n", strlen(arr1));
	printf("%d\n", strlen(arr2));


	strlen
	string length - 求字符串长度的函数
	
	int len = strlen("abc");
	printf("%d\n", len);

	printf("%s\n", arr1);
	printf("%s\n", arr2);

	return 0;
}

字符串是放在字符数组中的,直接char ch = "abc"是错误的。

char arr1[] = "abc";
char arr2[] = {'a', 'b', 'c', '\0'};

这两行代码的输出是一样的,“abc"中的\0省略了,而第二行,每一个字符都被单独拿出来了,如果省略\0就会出现问题。
迟迟到来的第二篇(vs2019中scanf报错)_第4张图片

 上面的字符数组2没有\0,所以它在打印abc后还会继续打印随机值,直到打印到0,就停止了。

下一篇应该明天就能写好了,拖了好久了~

你可能感兴趣的:(初识C语言,c语言)