23-24C++(48)——字符数组、结构体、强枚举、宏定义+strcpy_s(a,“ABC“)+strlen(a)+ typedef

一、字符数组

虽然字符串 string 类型在处理字符串的诸多方面比较便捷,但计算速度方面相对于 char 数组始终处于劣势,并且 C 语言中没有 string 类型。

为了后续数据结构和算法课程,以及硬件开发类课程,需要同时掌握 char 数组。

1、定义字符数组(不需要额外的头文件)

char a[4]; //定义一个长度为 4 的字符数组 2、在定义字符数组时初始化 char a[4]="ABC"; //这时 a 的值是"ABC",a[0]='A',a[1]='B',a[2]='C',a[3]='\0’

说明:

字符数组存储字符串的时候,以'\0'字符作为字符串结束标志。所有"..."方式表示的字符串都会自动在结尾处添加'\0’字符。 以="..."方式初始化字符数组时,一定要为字符串结束标志'\0'保留一个位置,如果 char a[3] = "ABC";则编译报错。 也可以 char a[4]={'A','B','C','\0'}; //以列举各元素值的方式初始化数字数组 还可以 char a[ ]="ABC"; 或者 char a[4] = { "ABC" }; 或者 char a[4]{ "ABC" };

3、对已经定义过的字符数组进行赋值 char a[4]; strcpy_s(a,"ABC"); //这时 a 的值是"ABC",a[0]='A',a[1]='B',a[2]='C',a[3]='\0’

4、把一个字符数组的值赋给另一个字符数组 char a[4]="ABC", b[4];  strcpy_s(b, a); //这时 b 的值是"ABC  “

 5、输入字符数组 char a[4]; cin>>a; //a 的值由输入决定,但最多只能输入 3 个字符,否则运行时错误 说明:cin 只能输入一个不带空格、'\t'、'\n'的字符串,即以空格、'\t'、'\n'作为字符串输入 的结束标记。 例如:cin>>a 时如果键盘输入 ab cde,其中 b 和 c 之间有一个空格,那么 a 的值为"ab"。

 6、输入字符数组(可能带空格以及'\t’)

char a[10]; cin.get(a, 10); //a 的值由输入决定,但最多只能输入 9 个字符或者遇到换行符'\n’ char a[10];

cin.getline(a, 10); //与 get 的区别在于,getline 会清除输入缓冲区的换行符'\n'

二、结构体

结构体是由多个数据成员构成的集合

相对于 C 中的 struct,C++中 struct 被强化,

与 第六章 class 的功能几乎相同。

【例 1】结构体应用

#include<iostream>
#include<string>
using namespace std;
struct Student
{
	int id; 
	string name;
	string major;
};
int main()
{
	Student s;
	s.id = 20008;
	s.name = "Tql";
	s.major = "IST";
	cout << s.id << " " << s.name << " " << s.major;
	return 0;
}

三、强枚举类型

1、强枚举类型规定了该类变量所有可能的取值,可以加强代码可读性。  

2、利用强枚举类型定义性别(可读性好)  

enum class Gender { Female, Male };

Gender gen = Gender::Male;

利用普通整型变量定义类型(可读性差)

int gen = 0; //0 代表男,1 代表女

【例 2】强枚举类型应用

#include<iostream>
#include<string>
using namespace std;
enum class Gender { Female, Male };
struct Student
{
    int id;
    Gender gen;
    string name;
    string major;
};
void print(Student s)
{
    cout << s.id << '\t';
    if (s.gen == Gender::Female)
        cout << "Female";
    else
        cout << "Male";
    cout << '\t' << s.name << '\t' << s.major << endl;
}
int main()
{
    Student s;
    s.id = 20008; s.gen = Gender::Female; s.name = "Tql"; s.major = "IST";
    print(s);
    return 0;
}
 

#include<iostream>
#include<string>
using namespace std;
enum class Gender { Female, Male };
struct Student
{
	int id;
	Gender gen;
	string name;
	string major;
};
void print(Student s)
{
	cout << s.id << '\t';
	if (s.gen == Gender::Female)
		cout << "Female";
	else
		cout << "Male";
	cout << '\t' << s.name << '\t' << s.major << endl;
}
int main()
{
	Student s;
	s.id = 20008; s.gen = Gender::Female; s.name = "Tql"; s.major = "IST";
	print(s);
	return 0;
}

四、文件包含预处理#include

1、#include:在 C++编译器安装路径的 include 文件夹下找头文件,用于包含 C++编译器自带的头文件。 路径 : C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC \14.28.29333\include 其中红色字体部分随 VS 版本不同会有所改变

2、#include"头文件名":先在程序所在目录下找头文件,找不到再到编译器安装路径下找, 用于包含用户自定义的头文件。 第六章 class 中会用到用户自定义的头文件。 (所以本章并不过多介绍)

五、宏定义#define

1、使用#define 语句定义某个特定的值或者表达式,注意语句不能有分号 #define PI 3.14 在编译前进行宏替换 例如上面的语句会导致编译器在编译前把代码中所有的 PI 都自动替换成 3.14(并不会错误 地替换到 PIG 或者 API) C++里更建议定义成 const double PI=3.14;

2、带参数的宏替换 #define MUL(a, b) a*b 例如上面的语句会导致编译器在编译前把代码中的 MUL(5, c)替换成 5*c,把 MUL(2, 3)替换 成 2*3

3、可能导致 bug 的宏替换

【例 3】宏定义应用
#include<iostream>
using namespace std;
#define MUL(a, b) a*b
#define DIV(a, b) a/b
int main()
{
	cout << DIV(MUL(5, 4), MUL(3, 2));
	return 0;
}

六、条件编译

1、条件编译指程序中的部分代码只有满足一定条件时才进行编译。 用于减小目标程序长度,在大型项目中应用较多。例如程序中的一个功能点,A 客户和 B 客 户的需求不同。

2、用"#ifdef 标识符"来判断该标识符是否被#define 语句定义过了,定义过了为真,没定义 过为假。含义相反的判断是"#ifndef 标识符"。

【例 4】条件编译应用
#include<iostream>
using namespace std;
#define CUSTOMERB
int main()
{
int cost = 0, hours;
cin >> hours;
#ifdef CUSTOMERA
cost = hours * 2;
#else ifdef CUSTOMERB 
//如果只有两个客户,也可以写成#else
if (hours > 5)
cost = 15;
else
cost = hours * 3;
#endif
cout << cost;
return 0;
}
【例 5】条件编译应用
#include<iostream>
using namespace std;
#define PI 3.14
int main()
{
	double r = 5, area;
#ifndef PI
	area = r * r;
#else
	area = PI * r * r;
#endif
	cout << area;
	return 0;
}

【例 6】条件编译应用
#include<iostream>
using namespace std;
#define A false
int main()
{
#if A
	cout << 1 << endl;
#else
	cout << 2 << endl;
#endif
	return 0;
}

【例 7】类型重定义应用
#include<iostream>
using namespace std;
typedef long long int int64;
int main()
{
int64 a = 123456789, b = 987654321, c;
c = a * b;
cout << c;
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拔刀能留住落樱吗、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值