初识C语言02

254 阅读6分钟

处理scanf警告

-运行以下程序时,有可能vs code版本不是2013导致,运行提示错误

#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);
}

运行后输入数字 空格 数字 得出sun= 和

-生成警告:

(后面还有打印):建议使用scanf_s

-解决办法:scanf是c语言提供的,scanf_s不是标准c语言提供的,vs编译器提供的,跨平台和移植性较差,例如gcc中运行中可能不支持,尽量少使用编译器提供的,使用c语言标准

在源文件的第一添加: #define _CRT_SECURE_NO_WARNINGS 1

每一个文件都添加太麻烦,解决;

当我们使用scanf 函数时,VS会报错误,错误内容为这个函数或者变量是不安全的。如果我们想要实现同样的输入函数的功能,我们可以用scanf_s函数来代替;但是如果我们仍然想要使用scanf函数,那我们就要在源文件代码的第一行(注意一定是第一行)加上

#define _CRT_SECURE_NO_WARNINGS 1 即可。

scanf_s 函数:VS编译提供的,不是C语言标准规定的。如果要使用这个函数,那么对应的代码只能在VS上编译运行,其他的编译器会报错,一般不建议使用这个函数。

但是我们每次使用scanf函数都要手动加上这一行代码会非常的麻烦,所以我们应该寻找另一种解决方案。步骤如下:

1、首先我们找到VS的安装目录:

2、使用搜索栏,搜索newc++file,搜索到后鼠标右击选择打开文件所在位置。

3、将这个路径复制下来,然后我们搜索应用 - 记事本,选择使用管理员权限打开记事本。若不是用管理员权限运行的记事本,最后修改完保存的时候,他会禁止我们保存,并让我们用管理员运行记事本。(如下图)

4、以管理员身份运行记事本之后,在菜单栏中的文件 - 打开,在弹出窗口将我们刚才复制的路径复制进去,就能看到我们搜索的文件了,然后选中该文件打开。(如下图)

5、打开后将我们添加到源文件中第一行的那串代码复制到记事本中,Ctrl + S保存并替换原文件即可(如下图)

常量

生活中不变的量,称为常量

常量的分类 -字面常量,直观赋值的量

int  num = 4;//字面常量
printf("%d\n", num);

-常变量,const 定义的常变量

//const -常属性,const声明的常变量  
	const int  num = 4;//常变量
	//num = 8; 变量声明num值可变, const 声明量为常变量不可重新赋值
	printf("%d\n", num);//4

-#define 定义的标识符常量

// #define 定义的标识符常量
#define MAX 10

int main(){
  int arr[MAX] = { 0 };
	printf("%d\n", MAX);//8  
}

-枚举常量

//枚举常量,枚举 一一列举
//例如:男,女,保密
// 例如: 红,绿,蓝    ...  星期等
//枚举关键字  - emum
enum Sex {
	MALE,
	FEMALE,
	SECREF
};//MALE,,FEMALE,,SECREF 被称为枚举常量
int main(){
  enum Sex MALE =1000;
  //Sex=FEMALE;
  //SECREF=6; //err
	printf("%d\n", MALE);
	printf("%d\n", FEMALE);
	printf("%d\n", SECREF);
}

字符串

	//数据在计算机上存储的时候,存储的是2进制
	//对应的是ASCII 值, 可对照ASCII表
	char arr1[] = "abc";//字符串放到数组里面
	char arr2[] = { 'a','b','c' };//末尾默认带\0,表示结束的意思
	char arr3[] = { 'a','b','c',0 };
	printf("%s\n", arr1);//abc
	printf("%s\n", arr2);//abc打发发达的所发生的
	printf("%s\n", arr3);//abc

	//strlen 用于计算字符串长度
	printf("%d\n", strlen(arr1));//3
	printf("%d\n", strlen(arr2));//随机值

打印结果:

-启动调试,fn+f10,发现把abc放入数组之后,数组末尾放着一个0,其实这个0是\0

char arr2[] = { 'a','b','c',0 };//加上0之后,显示正常 abc abc

注:字符串的结束标志是一个\0,\0表示结束的意思,\0至关重要

转义符

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>

int main() {
	printf("\n");//\n换行

	printf("c:\test\32\test.c");//\t 水平制表符
		//?  加上 \?? 不转义三字母词语 
	printf("(are you ok??)\n");//老的编译器会把??)转换成了空格,  ??+)三字母词
	
	// \两个斜杆,不转义字符
	//printf("%s\n",''');

	// 转义字符计算字符长度时一个计算为一个字符   
	printf("%d\n",strlen("c:\test\32\test.c"));//\32是2个8进制数字,代表ASCII 码表序号32的字符
	printf("\132"); //1*8^2+3*8^1+2*8^0  ==132  对应ASCII码值Z

	printf("\xdd");// \xdd 表示两个十六进制的数字  \ddd表示1-3个八进制的数字
	return 0;
}

注:\ 斜杆后面加数字后面两个数字是8进制 ,\斜杆后面加 x 后面两个数字是16进制

注释

C的注释风格: /* 注释内容 */ ,不能嵌套

c++的注释风格: //注释内容

逻辑语句

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>

int main() {
	int input = 0;
	printf("%s要好好学习嘛?(1/0)>:");
	scanf("%d", &input);// 1/0
	if (input == 1) {
		printf("好offer\n");
	}
	else {
		printf("卖红薯\n");
	}
	return 0;
}

循环语句

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>

int main() {
	int line = 0;
	printf("敲一行代码\n");
	//while循环
	while(line < 20000) {
		printf("敲1行代码%d\n", line);
		line++;
	};
	if (line>=20000) {
		printf("好offer");
	};
	return 0;
}

封装函数

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>

int main() {
	int num1 = 10;
	int num2 = 20;
	int sum = 0;
	int a = 100;
	int b = 100;
	sum= ADD(num1, num2);
	printf("sum=%d\n", sum);
	sum= ADD(a, b);
	printf("sum=%d\n", sum);
	return 0;
}

//ADD 函数体
ADD(int a,int b) {
	int z = a + b;
	return z;
}

数组

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <string.h>
//数组 一组相同类型数据的集合

int main() {
	int input = 0;
	//开辟一个空间存放1-10,同时规定每个元素都具有一个下标,下标从0开始
	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	//char ch[20];
	//float fl[5];
	
	//下标访问元素
	printf("%d\n",arr[4]);//5

	//打印全部下标
	int i = 0;
	while (i<10) {
		printf("%d\n", arr[i]);
		i++;
	};
	scanf("%d",&input);
	printf("%d",arr[input]);
}

操作符

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <string.h>

int main() {
	int a = 5 % 2;//取模
	printf("a\t%d\n",a);

	//移位操作符   << 左移   >>右移   
	int b = 1;
	//整型1占4个字节-32bit 位   
	printf("b1\t%d\n", b << 2);
	printf("b2\t%d\n", b >> 2);

	//位操作符 & 按位与, | 按位或, ^ 按位异,二进制位
	int c = a & b;
	printf("c\t%d\n",c);
	int d = a | b;
	printf("d\t%d\n", d);
	int e = a ^ b;//异或  计算规律:对应的二进制位相同,则为0, 对应的二进制位相异,则为1
	printf("e\t%d\n", e);

	//赋值操作符
	int f = 10;//赋值
	f = 20;
	f = f + 10;
	//复合赋值符
	f += 10;
	f -= 10;
	f = f & 2;
	f = f | 1000;

	//单目操作符 ,有1个操作符 比如 !10  +1正数  -1负数 
	printf("%d\n",!10);//! 把真改为假,假为真
	//双目操作符,有两个操作符  a+b +就是双目
	//三目操作符,有多个操作符
	return 0;
}

sizeof

#include <stdio.h>
#include <string.h>

int main() {
	//计算数组的元素个数   个数=数组的总大小/每个元素的大小
	int sz = 0;
	int arr[10] = { 0 };//10个整型元素的大小
	sz = sizeof(arr) / sizeof(arr[0]);
	printf("sz%d\n", sz);
	return 0;

}