函数不安全报错

#include <stdio.h>
int main() {
	int age = 0;
	printf("请输入你的年龄:\n");
	scanf("%d",&age);
	printf("你的年龄为:%d",age);
	return 0;
}

在使用scanf()函数时,编译器报错如下:

image-20220628104542773

解决办法:

  1. 使用scanf_s() 替换scanf()函数

缺点:scanf_s()是vs编辑器提供的,如果移植到其它编译器将不能识别。

  1. 使用在代码第一行加上==#define _CRT_SECURE_NO_WARNINGS 1==

image-20220628105104528

  1. 在项目属性中设置预处理器定义中加上:_CRT_SECURE_NO_WARNINGS

image-20220628105213575

  1. 避免每次写代码都需要手动添加

找到vs安装目录下的这个文件:

image-20220628110055985

编辑文件,加上这一行代码:==#define _CRT_SECURE_NO_WARNINGS 1==

保存并退出。这样在新建的源文件中将自动添加这句话。

1. 常量

  • 字面常量
  • ==const==修饰的常变量
  • #define 定义的标识符常量
  • 枚举常量
#include <stdio.h>
#define MAX 100 //3.define定义的标识符常量
int main() {
	3;//1.字面常量
	const int var = 10;//2.const 修饰的常变量
	//4. 枚举常量
	enum Color 
	{
		Red,
		Blue,
		Yellow
	};
	enum Sex {
		Man=1,//可以手动修改起始的数值
		Woman,
	};
	enum Color color = Red;
	enum Sex she = Woman;
	printf("%d\n",color);//enum 内部从0开始
	printf("%d\n",she);//输出2
	return 0;
}

2.字符串

  • 定义

由双引号引起来的==一串字符==称为字符串字面值,简称字符串。

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

#include <stdio.h>
int main() {
	char arr[] = "abcdefg";//用数组存放字符串
	printf("%s\n",arr);
	return 0;
}

1.1 打印字符串和一串字符

image-20220628143505311

  • 为什么出现乱码?

在打印字符数组a时,打印是从字符 'a' 开始,直到字符串结束标志 \0,这时打印就结束了。

而再打印字符数组b时,打印从字符 'a' 开始,在打印完字符 'c' 后并==没有字符串结束标志==,这时打印就会继续,因为数组都是存储在内存当中的,打印会一直向下进行,直到碰到字符串结束标志才会停止打印。

  • 如果给数组b手动加上结束标志?

成功消除乱码。

image-20220628143949678

1.2 计算字符串长度函数strlen()

strlen()用于计算字符串长度。

#include <stdio.h>
int main() {
	char a[] = "abc";//用数组存放字符串
	char b[] = { 'a','b','c' };
	int len_a = strlen(a);
	int len_b = strlen(b);

	printf("%s\n",a);
	printf("%d\n", len_a);

	printf("%s\n",b);
	printf("%d\n", len_b);
	return 0;
}

image-20220628144633053

用大括号括起来的字符的数组长度是随机值(不确定值)。

1.3 用sizeof函数求取数组长度:

image-20220628145238659

3. 转义字符\

常用转义字符 含义
\t 水平制表符
\v 垂直制表
\o 空字符
\n 换行符
\’ 代表一个单引号字符
\” 代表一个双引号字符
\\ 代表一个反斜线字符"\"

4.注释

c语言风格注释image-20220628202248691

==这种注释是不支持嵌套的==

c++风格注释:

image-20220628202334625

  • vs批量注释快捷键:

注释:Ctrl + K,Ctrl + C;==(c代表comment,注释)==

取消注释: Ctrl +K,Ctrl + U;==(u代表uncomment,取消注释)==

5. if -else

  1. 符号判断器:输入一个值,判断是正数还是负数;
#include <stdio.h>
int main() {
	int var = 0;
	scanf("%d",&var);
	if (var >= 0) {
		printf("这是个正数.\n");
	}
	 if (var == 0) {
		printf("这是0.\n");
	}
	else {
		printf("这是个负数!\n");
	}
	return 0;
}

image-20220628203027631

未命名文件

  1. 成绩判断器:给成绩分等级
#include <stdio.h>
int main() {
	int score = 0;
	scanf("%d", &score);
	if (score <=100&&score>0) {
		printf("成绩有效\n");
		if (score >= 85) {
			printf("成绩优秀\n");
		}
		else if (score >= 70) {
			printf("成绩一般\n");
		}
		else if (score >= 60) {
			printf("成绩合格!\n");
		}
		else {
			printf("不合格!\n");
		}
	}
	return 0;
}

未命名文件 (1)image-20220628204718716

6. while

#include <stdio.h>
int main() {
	int i = 10;
	while (i>=0) {
		printf("%d\t",i);
		i--;
	}
	return 0;
}

while()括号内是条件,只要满足条件,就执行大括号内的代码;

如果括号内为常量,例如while(1),while(true),while(3>2)

则循环没有跳出的条件,视为死循环。

image-20220628204945535

7. do - while

#include <stdio.h>
int main() {
	int i = 0;
	while (i>=10) {
		printf("while");
		i--;
	}
	int j = 0;
	do {
		printf("do-while");
		j++;
	} while (j >= 10);

	return 0;
}

image-20220628205658300

do -while 无论是否满足while括号内的条件都会执行一次do里面的内容。

8. for

  • 九九乘法表:
#include <stdio.h>
int main() {
	for (int i = 1; i <= 9; i++) {
		for (int j = 1; j <= i; j++) {
			int pro = i * j;
			printf("%d * %d = %d\t",j,i,pro);		
		}
		printf("\n");
	}
	return 0;
}

image-20220628210518155

9. switch-case

  • 计算器:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int demo09() {
	int num1, num2;
	char operator;
	while (1) {
		scanf("%d %c %d", &num1, &operator,&num2);
		switch (operator)
		{
		case '+':
			printf("%d %c %d = %d\n", num1, operator,num2, num1 + num2);
			break;

		case '-':
			printf("%d %c %d = %d\n", num1, operator,num2, num1 - num2);
			break;

		case '*':
			printf("%d %c %d = %d\n", num1, operator,num2, num1 * num2);
			break;

		case '/':
			printf("%d %c %d = %.2f\n", num1, operator,num2, (float)num1 / (float)num2);
			break;
		default:
			break;
		}
		

	}
	
	return 0;
}

image-20220628212346078

10 算术运算符

10.1 单目运算符

  • !:逻辑反操作
  • &:取地址
  • sizeof:操作数的类型长度(以字节为单位)
  • ~:对一个二进制数按位取反

10.2 关系操作符

  • || :或
  • &&:与
  • !:非

10.3 三目操作符

==b ? x : y==

如果b为真,则输出x,反之输出y;

#include <stdio.h>
int main() {
	int max = 0;
	int a, b;
	scanf("%d %d",&a,&b);
	max = a > b ? a : b;
	printf("max=%d\n",max);
	return 0;
}

image-20220628213608932