【C++基础】通讯录管理系统

系统需求

通讯录是一个可以记录亲人、好友信息的工具

本教程主要利用C++来实现一个 通讯录管理系统

系统中需要实现的功能如下:

  • 添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址),且最多记录1000人
  • 显示联系人:显示通讯录中所有联系人信息
  • 删除联系人:按照姓名进行删除指定联系人
  • 查找联系人:按照姓名查看指定联系人的信息
  • 修改联系人:按照姓名重新修改指定联系人
  • 清空联系人:清空通讯录中所有信息
  • 退出通讯录:退出当前使用的通讯录

创建项目

创建项目步骤如下:

  • 创建新项目
  • 添加文件

菜单功能

功能描述:用户选择功能的界面

步骤

  • 封装显示菜单函数,如 void showMenu()
  • 在main函数中调用封装好的函数
// 菜单界面
void showMenu() {
    cout << "**************************" << endl;
    cout << "*****  1、添加联系人  *****" << endl;
    cout << "*****  2、显示联系人  *****" << endl;
    cout << "*****  3、删除联系人  *****" << endl;
    cout << "*****  4、查找联系人  *****" << endl;
    cout << "*****  5、修改联系人  *****" << endl;
    cout << "*****  6、清空联系人  *****" << endl;
    cout << "*****  0、退出通讯录  *****" << endl;
    cout << "**************************" << endl;
}

int main() {
    // 菜单调用
    showMenu();

    system("pause");
    return 0;
}

退出功能

功能描述:退出通讯录系统

思路:首先考虑把架子弄出来,使用 多选择的结构,考虑 switchif - else

根据用户不同的选择,进入不同的功能,可以选择switch分支结构,将整个框架进行搭建

当用户选择 0 时,执行退出,若选择其他则先不做操作,也不会退出循环,因为break 退出的是 switch,并不会退出 while 循环,而选择 0 时的 return 0会直接退出程序

int main() {
    int select = 0;  // 创建用户选择输入的变量

    while (true) {
        showMenu();  // 菜单调用

        cin >> select;

        switch (select) {
        case 1:  // 1、添加联系人
            break;
        case 2:  // 2、显示联系人
            break;
        case 3:  // 3、删除联系人
            break;
        case 4:  // 4、查找联系人
            break;
        case 5:  // 5、修改联系人
            break;
        case 6:  // 6、清空联系人
            break;
        case 0:  // 0、退出通讯录
            cout << "欢迎下次使用" << endl;
            system("pause");
            return 0;
        default:
            break;
        }
    }

    system("pause");
    return 0;
}

添加联系人

功能描述:实现添加联系人功能,联系人上限为1000人,联系人信息包括(姓名、性别、年龄、联系电话、家庭住址)

添加联系人实现步骤

  • 设计 联系人结构体
  • 设计 通讯录结构体(用于存放联系人,并记录当前有多少人在通讯录中)
  • main函数中创建通讯录
  • 封装添加联系人函数
  • 测试添加联系人函数

设计联系人结构体

联系人信息包括:姓名、性别、年龄、联系电话、家庭住址

设计如下:

#include   // string头文件

// 联系人结构体
struct Person {
    string m_Name;  // 姓名
    int m_Sex;  // 性别:1男,2女
    int m_Age;  // 年龄
    string m_Phone;  // 电话
    string m_Addr;  // 住址
};

具体实现:

// 设计联系人结构体
struct Person {
    // 姓名
    string m_Name;

    // 性别  1 男 2 女,提示用户输入数字,从而避免用户输入其他数据
    int m_Sex;

    // 年龄
    int m_Age;

    // 电话
    string m_Phone;

    // 住址
    string m_Addr;
};

设计通讯录结构体

设计时,可以在通讯录结构体中,维护一个容量为1000的存放联系人的数组,并记录当前通讯录中联系人数量

#define MAX 1000  // 最大人数,以后要改通讯录人数上限时,在这里修改即可

// 通讯录结构体
struct Addressbooks {
  struct Person personArray[MAX];  // 通讯录中保存的联系人数组
    int m_Size;  // 通讯录中人员个数
};

具体实现

// 通讯录结构体
struct Addressbooks {
    // 通讯录中保存的联系人数组
    struct Person personArray[MAX];
    // 用MAX宏常量,方便维护数组大小

    // 通讯录中当前记录的联系人个数
    int m_Size;
};

main函数中创建通讯录

添加联系人函数封装好后,在main函数中创建一个通讯录变量,这个就是我们需要一直维护的通讯录

Addressbooks abs;  // 创建通讯录结构体变量
abs.m_Size = 0;  // 初始化通讯录中当前人员个数

封装添加联系人函数

// 1、添加联系人
void addPerson(Addressbooks * abs) {
    // 判断通讯录是否已满,如果满了就不再添加
    if (abs->m_Size == MAX) {
        cout << "通讯录已满,无法添加" << endl;
        return;
    } else {
        // 添加具体联系人
        // 姓名
        string name;
        cout << "请输入姓名:" << endl;
        cin >> name;
        // 利用当前人员个数,实现添加功能
        abs->personArray[abs->m_Size].m_Name = name;

        // 性别
        cout << "请输入性别:" << endl;
        cout << "1 --- 男" << endl;
        cout << "2 --- 女" << endl;
        int sex = 0;

        while (true) {  // 循环可以让其输入其他数字或字符时,使其重新输入
            // 如果输入的是1 或者 2,可以退出循环,因为输入的是正确值
            // 如果输入有误,需要重新输入
            cin >> sex;
            if (sex == 1 || sex == 2) {
                abs->personArray[abs->m_Size].m_Sex = sex;
                break;
            }
            cout << "输入有误,请重新输入" << endl;
        }

        // 年龄
        cout << "请输入年龄:" << endl;
        int age = 0;
        cin >> age;
        abs->personArray[abs->m_Size].m_Age = age;

        // 电话
        cout << "请输入联系电话:" << endl;
        string phone;
        cin >> phone;
        abs->personArray[abs->m_Size].m_Phone = phone;

        // 家庭住址
        cout << "请输入家庭住址:" << endl;
        string address;
        cin >> address;
        abs->personArray[abs->m_Size].m_Addr = address;

        // 更新通讯录人数
        abs->m_Size++;
        cout << "添加成功" << endl;

        system("pause");  // 请按任意键继续
        // 清屏
        system("cls");  // 清屏操作
    }

}

显示联系人

功能描述:显示通讯录中已有的联系人信息

显示联系人实现步骤

  • 封装显示联系人函数
  • 测试显示联系人函数

封装显示联系人函数

思路:判断如果当前通讯录中没有人员,就提示记录为空,人数大于0,显示通讯录中的信息

void showPerson(Addressbooks * abs) {
    // 判断通讯录中人数是否为0,如果为0,提示记录为空
    // 如果不为0,显示记录的联系人信息
    if (abs->m_Size == 0) {
        cout << "当前记录为空" << endl;
    }
    else {
        for (int i = 0; i < abs->m_Size; i++) {
            cout << "姓名:" << abs->personArray[i].m_Name << "\t";
            cout << "性别:" << (abs->personArray[i].m_Sex == 1 ? "男" : "女") << "\t";
            cout << "年龄:" << abs->personArray[i].m_Age << "\t";
            cout << "电话:" << abs->personArray[i].m_Phone << "\t";
            cout << "住址:" << abs->personArray[i].m_Addr << endl;
        }
    }
    system("pause");
    system("cls");
}

删除联系人

功能描述:按照姓名进行删除指定联系人

删除联系人实现步骤

  • 封装检测联系人是否存在
  • 封装删除联系人函数
  • 测试删除联系人功能

封装检测联系人是否存在

在删除、查找、修改,都需要用到这个函数,去按姓名查找信息,所以对其进行封装

设计思路

删除联系人前,需要先判断用户输入的联系人是否存在,如果存在则删除,不存在则提示用户没有要删除的联系人,因此我们可以把检测联系人是否存在封装在一个函数中,如果存在,返回联系人在通讯录中的位置,不存在返回 -1

在switch中,如果case中的语句很长,需要括起来,有时候会报错

【C++基础】通讯录管理系统

比如:

switch (select) {
        case 3: {  // 3、删除联系人
            cout << "请输入删除联系人姓名:" << endl;
            string name;
            cin >> name;

            if (isExist(&abs, name) == -1) cout << "查无此人";
            else cout << "找到此人" << endl;
        }
        }

此时case 3就应当用 {}包括,否则会报错

检测联系人是否存在具体实现:

// 检测联系人是否存在
// 如果存在,返回联系人所在数组中的具体位置,不存在,返回-1
// 参数1 通讯录,参数2 做对比姓名
int isExist(Addressbooks * abs, string name) {
    // 检测本质:遍历通讯录中所有人名,和传进来的人名是否一致,如果一致,返回位置,不一致返回-1
    for (int i = 0; i < abs->m_Size; i++) {
        // 找到用户输入的姓名了
        if (abs->personArray[i].m_Name == name) {
            return i;  // 找到了,返回了这个人在数组中的下标编号
        }
    }
    return -1; // 如果遍历结束都没有找到,返回-1
}

封装删除联系人函数

删除的实现

【C++基础】通讯录管理系统

比如:要将 李四删掉,已知李四下标

删除过程:把王五的数据覆盖李四,赵六覆盖王五,总人数减1

将李四后的数据向前移动,并且让通讯录中记录的人员个数做一个减1的操作

先让王五移动,再让赵六移动,只能一个个移动

根据用户输入的联系人判断该通讯录中是否有此人

查找到进行删除,并提示删除成功

查不到提示查无此人

void deletePerson(Addressbooks * abs) {
    cout << "请输入要删除的联系人:" << endl;
    string name;
    cin >> name;

    int ret = isExist(abs, name);
    // ret == -1 未查到
    // ret != -1 查到了

    if (ret != -1) {
        // 查找到人,进行删除操作
        for (int i = ret; i < abs->m_Size; i++) {  // 让ret位置后面的元素都前移
            // 数据前移操作
            abs->personArray[i] = abs->personArray[i + 1];
        }
        abs->m_Size--;  // 更新通讯录中的人员数
        cout << "删除成功" << endl;
    }
    else {
        cout << "查无此人" << endl;
    }
}

查找联系人

功能描述:按照姓名查看指定联系人信息

查找联系人实现步骤

  • 封装查找联系人函数
  • 测试查找指定联系人

封装查找联系人函数

实现思路:判断用户指定的联系人是否存在,如果存在显示信息,不存在则提示查无此人

void findPerson(Addressbooks * abs) {
    cout << "请输入要查找的联系人:" << endl;
    string name;
    cin >> name;

    // 判断指定的联系人是否存在通讯录中
    int ret = isExist(abs, name);
    // ret == -1 未查到
    // ret != -1 查到了
    if (ret != -1) {  // 找到联系人
        cout << "姓名:" << abs->personArray[ret].m_Name << "\t";
        cout << "性别:" << (abs->personArray[ret].m_Sex == 1 ? "男" : "女") << "\t";
        cout << "年龄:" << abs->personArray[ret].m_Age << "\t";
        cout << "电话:" << abs->personArray[ret].m_Phone << "\t";
        cout << "住址:" << abs->personArray[ret].m_Addr << endl;
    }
    else {  // 没找到联系人
        cout << "查无此人" << endl;
    }

    // 按任意键清屏
    system("pause");
    system("cls");

}

修改联系人

功能描述:按照姓名重新修改指定联系人

修改联系人实现步骤

  • 封装修改联系人函数
  • 测试修改联系人函数

封装修改联系人函数

实现思路:查找用户输入的联系人,如果查找成功进行修改操作,查找失败提示查无此人

void modifyPerson(Addressbooks * abs) {
    cout << "请输入要修改的联系人" << endl;
    string name;
    cin >> name;

    int ret = isExist(abs, name);

    if (ret != -1) {  // 找到指定联系人
        // 姓名
        string name;
        cout << "请输入姓名:" << endl;
        cin >> name;
        abs->personArray[ret].m_Name = name;

        // 性别
        cout << "请输入性别:" << endl;
        cout << "1 --- 男" << endl;
        cout << "2 --- 女" << endl;

        int sex = 0;

        while (true) {
            cin >> sex;
            if (sex == 1 || sex == 2) {
                // 输入正确,退出循环输入
                abs->personArray[ret].m_Sex = sex;
                break;
            }
            cout << "输入有误,请重新输入" << endl;
        }

        // 年龄
        cout << "请输入姓名:" << endl;
        int age = 0;
        cin >> age;
        abs->personArray[ret].m_Age = age;

        // 电话
        cout << "请输入联系电话:" << endl;
        string phone;
        cin >> phone;
        abs->personArray[ret].m_Phone = phone;

        // 住址
        cout << "请输入家庭住址:" << endl;
        string address;
        cin >> address;
        abs->personArray[ret].m_Addr = address;

        cout << "修改成功" << endl;
    }
    else {  // 未找到联系人
        cout << "查无此人" << endl;
    }

    // 按任意键后清屏
    system("pasue");
    system("cls");

}

清空联系人

功能描述:清空通讯录中所有信息

清空联系人实现步骤

  • 封装清空联系人函数
  • 测试清空联系人

封装清空联系人函数

实现思路:将通讯录所有联系人信息清除掉,只要将通讯录记录的联系人数量置为0,做逻辑清空即可。

不需要使用循环将所有人信息清空,逻辑清空即可

void cleanPerson(Addressbooks * abs) {
    cout << "是否真的要清空通讯录" << endl;
    cout << "1 --- 清空" << endl;
    cout << "2 --- 不清空" << endl;

    int select = 0;

    while (true) {
        cin >> select;
        if (select == 1) {
            abs->m_Size = 0;  // 将当前记录联系人数量置为0,做逻辑清空操作
            cout << "通讯录已清空" << endl;
            break;
        }
        else if (select == 2){
            break;
        }
        cout << "输入有误,请重新输入" << endl;
    }

    // 按任意键清屏
    system("pause");
    system("cls");
}

完整代码:

#include
#include
#define MAX 1000

using namespace std;

// 设计联系人结构体
struct Person {
    // 姓名
    string m_Name;

    // 性别  1 男 2 女,提示用户输入数字,从而避免用户输入其他数据
    int m_Sex;

    // 年龄
    int m_Age;

    // 电话
    string m_Phone;

    // 住址
    string m_Addr;
};

// 通讯录结构体
struct Addressbooks {
    // 通讯录中保存的联系人数组
    struct Person personArray[MAX];
    // 用MAX宏常量,方便维护数组大小

    // 通讯录中当前记录的联系人个数
    int m_Size;
};

// 1、添加联系人
void addPerson(Addressbooks * abs) {
    // 判断通讯录是否已满,如果满了就不再添加
    if (abs->m_Size == MAX) {
        cout << "通讯录已满,无法添加" << endl;
        return;
    } else {
        // 添加具体联系人
        // 姓名
        string name;
        cout << "请输入姓名:" << endl;
        cin >> name;
        // 利用当前人员个数,实现添加功能
        abs->personArray[abs->m_Size].m_Name = name;

        // 性别
        cout << "请输入性别:" << endl;
        cout << "1 --- 男" << endl;
        cout << "2 --- 女" << endl;
        int sex = 0;

        while (true) {  // 循环可以让其输入其他数字或字符时,使其重新输入
            // 如果输入的是1 或者 2,可以退出循环,因为输入的是正确值
            // 如果输入有误,需要重新输入
            cin >> sex;
            if (sex == 1 || sex == 2) {
                abs->personArray[abs->m_Size].m_Sex = sex;
                break;
            }
            cout << "输入有误,请重新输入" << endl;
        }

        // 年龄
        cout << "请输入年龄:" << endl;
        int age = 0;
        cin >> age;
        abs->personArray[abs->m_Size].m_Age = age;

        // 电话
        cout << "请输入联系电话:" << endl;
        string phone;
        cin >> phone;
        abs->personArray[abs->m_Size].m_Phone = phone;

        // 家庭住址
        cout << "请输入家庭住址:" << endl;
        string address;
        cin >> address;
        abs->personArray[abs->m_Size].m_Addr = address;

        // 更新通讯录人数
        abs->m_Size++;
        cout << "添加成功" << endl;

        system("pause");  // 请按任意键继续
        // 清屏
        system("cls");  // 清屏操作
    }

}

// 2、显示所有联系人
void showPerson(Addressbooks * abs) {
    // 判断通讯录中人数是否为0,如果为0,提示记录为空
    // 如果不为0,显示记录的联系人信息
    if (abs->m_Size == 0) {
        cout << "当前记录为空" << endl;
    }
    else {
        for (int i = 0; i < abs->m_Size; i++) {
            cout << "姓名:" << abs->personArray[i].m_Name << "\t";
            cout << "性别:" << (abs->personArray[i].m_Sex == 1 ? "男" : "女") << "\t";
            cout << "年龄:" << abs->personArray[i].m_Age << "\t";
            cout << "电话:" << abs->personArray[i].m_Phone << "\t";
            cout << "住址:" << abs->personArray[i].m_Addr << endl;
        }
    }
    system("pause");
    system("cls");
}

// 检测联系人是否存在
// 如果存在,返回联系人所在数组中的具体位置,不存在,返回-1
// 参数1 通讯录,参数2 做对比姓名
int isExist(Addressbooks * abs, string name) {
    // 检测本质:遍历通讯录中所有人名,和传进来的人名是否一致,如果一致,返回位置,不一致返回-1
    for (int i = 0; i < abs->m_Size; i++) {
        // 找到用户输入的姓名了
        if (abs->personArray[i].m_Name == name) {
            return i;  // 找到了,返回了这个人在数组中的下标编号
        }
    }
    return -1; // 如果遍历结束都没有找到,返回-1
}

// 3、删除指定联系人
void deletePerson(Addressbooks * abs) {
    cout << "请输入要删除的联系人:" << endl;
    string name;
    cin >> name;

    int ret = isExist(abs, name);
    // ret == -1 未查到
    // ret != -1 查到了

    if (ret != -1) {
        // 查找到人,进行删除操作
        for (int i = ret; i < abs->m_Size; i++) {  // 让ret位置后面的元素都前移
            // 数据前移操作
            abs->personArray[i] = abs->personArray[i + 1];
        }
        abs->m_Size--;  // 更新通讯录中的人员数
        cout << "删除成功" << endl;
    }
    else {
        cout << "查无此人" << endl;
    }
}

// 4、查找指定联系人信息
void findPerson(Addressbooks * abs) {
    cout << "请输入要查找的联系人:" << endl;
    string name;
    cin >> name;

    // 判断指定的联系人是否存在通讯录中
    int ret = isExist(abs, name);
    // ret == -1 未查到
    // ret != -1 查到了
    if (ret != -1) {  // 找到联系人
        cout << "姓名:" << abs->personArray[ret].m_Name << "\t";
        cout << "性别:" << (abs->personArray[ret].m_Sex == 1 ? "男" : "女") << "\t";
        cout << "年龄:" << abs->personArray[ret].m_Age << "\t";
        cout << "电话:" << abs->personArray[ret].m_Phone << "\t";
        cout << "住址:" << abs->personArray[ret].m_Addr << endl;
    }
    else {  // 没找到联系人
        cout << "查无此人" << endl;
    }

    // 按任意键清屏
    system("pause");
    system("cls");

}

// 5、修改指定的联系人信息
void modifyPerson(Addressbooks * abs) {
    cout << "请输入要修改的联系人" << endl;
    string name;
    cin >> name;

    int ret = isExist(abs, name);

    if (ret != -1) {  // 找到指定联系人
        // 姓名
        string name;
        cout << "请输入姓名:" << endl;
        cin >> name;
        abs->personArray[ret].m_Name = name;

        // 性别
        cout << "请输入性别:" << endl;
        cout << "1 --- 男" << endl;
        cout << "2 --- 女" << endl;

        int sex = 0;

        while (true) {
            cin >> sex;
            if (sex == 1 || sex == 2) {
                // 输入正确,退出循环输入
                abs->personArray[ret].m_Sex = sex;
                break;
            }
            cout << "输入有误,请重新输入" << endl;
        }

        // 年龄
        cout << "请输入姓名:" << endl;
        int age = 0;
        cin >> age;
        abs->personArray[ret].m_Age = age;

        // 电话
        cout << "请输入联系电话:" << endl;
        string phone;
        cin >> phone;
        abs->personArray[ret].m_Phone = phone;

        // 住址
        cout << "请输入家庭住址:" << endl;
        string address;
        cin >> address;
        abs->personArray[ret].m_Addr = address;

        cout << "修改成功" << endl;
    }
    else {  // 未找到联系人
        cout << "查无此人" << endl;
    }

    // 按任意键后清屏
    system("pasue");
    system("cls");

}

void cleanPerson(Addressbooks * abs) {
    cout << "是否真的要清空通讯录" << endl;
    cout << "1 --- 清空" << endl;
    cout << "2 --- 不清空" << endl;

    int select = 0;

    while (true) {
        cin >> select;
        if (select == 1) {
            abs->m_Size = 0;  // 将当前记录联系人数量置为0,做逻辑清空操作
            cout << "通讯录已清空" << endl;
            break;
        }
        else if (select == 2){
            break;
        }
        cout << "输入有误,请重新输入" << endl;
    }

    // 按任意键清屏
    system("pause");
    system("cls");
}

// 菜单界面
void showMenu() {
    cout << "***************************" << endl;
    cout << "*****  1、添加联系人  *****" << endl;
    cout << "*****  2、显示联系人  *****" << endl;
    cout << "*****  3、删除联系人  *****" << endl;
    cout << "*****  4、查找联系人  *****" << endl;
    cout << "*****  5、修改联系人  *****" << endl;
    cout << "*****  6、清空联系人  *****" << endl;
    cout << "*****  0、退出通讯录  *****" << endl;
    cout << "***************************" << endl;
}

int main() {
    // 创建通讯录结构体变量
    Addressbooks abs;

    // 初始化通讯录中当前人员个数
    abs.m_Size = 0;

    int select = 0;  // 创建用户选择输入的变量

    while (true) {
        showMenu();  // 菜单调用

        cin >> select;

        switch (select) {
        case 1:  // 1、添加联系人
            // addPerson函数一定要用地址传递
            addPerson(&abs);  // 利用地址传递,可以修改实参
            break;
        case 2:  // 2、显示联系人
            showPerson(&abs);
            break;
        case 3: {  // 3、删除联系人
            /*cout << "请输入删除联系人姓名:" << endl;
            string name;
            cin >> name;

            if (isExist(&abs, name) == -1) cout << "查无此人";
            else cout << "找到此人" << endl;*/
            deletePerson(&abs);
            break;
        }

        case 4:  // 4、查找联系人
            findPerson(&abs);
            break;
        case 5:  // 5、修改联系人
            modifyPerson(&abs);
            break;
        case 6:  // 6、清空联系人
            cleanPerson(&abs);
            break;
        case 0:  // 0、退出通讯录
            cout << "欢迎下次使用" << endl;
            system("pause");
            return 0;
        default:
            break;
        }

    }

    system("pause");
    return 0;
}

Original: https://www.cnblogs.com/seansheep/p/15958641.html
Author: 在青青草原上抓羊
Title: 【C++基础】通讯录管理系统

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/608963/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SpringBoot 2.1.9 整合 Redisson分布式锁

    官方参考文档 redisson-spring-boot-starter 官方文档 通过YAML文件配置单节点模式 一)、引入Redisson整合Spring Boot依赖 二)、通…

    Linux 2023年5月28日
    095
  • 记一次从源码泄露到getshell(二)

    0x00 前言 文章所述漏洞已经提交至漏洞平台,且所有恶意操作均已复原 0x01 源码泄露 http://www.xxx.com.cn/www.zip 老规矩拿到源码先通关关键词找…

    Linux 2023年5月28日
    098
  • postgresql 自增列 初始值设置

    — 获取自增列的名称 SELECT pg_get_serial_sequence(‘table_name’, ‘id’) AS sequence_name; –获取自增列的下一…

    Linux 2023年6月14日
    058
  • shell xargs技巧

    find /home/tomcat8-hk/ -name ‘808*.sh’ | xargs -i sed ‘s@CATALINA_HOME=&…

    Linux 2023年5月28日
    088
  • [ Linux ] 设置开机自动登录

    https://www.cnblogs.com/yeungchie/ 查看桌面环境 file -L /etc/systemd/system/display-manager.serv…

    Linux 2023年6月7日
    096
  • XCTF pwn新手区解题记录

    一、前言 闲来无事,刷刷ctf题 二、题目: level0 1、下载好题目后,拖入到kali中去,用 file 和 checksec 查看一下,可以发现该程序是 64&#x…

    Linux 2023年6月8日
    099
  • ssh远程连接服务(二)三台虚拟机之间的免密登录

    创建三台虚拟机主机名分别为node01、node02、node03 在node01虚拟机上生成密钥对 然后将生成的公钥分别复制到node02、node03的虚拟机上(前提三台虚拟机…

    Linux 2023年6月7日
    094
  • Linux——防火墙、SELinux规则

    防火墙的功能:简单地释放或阻止某些服务和端口 [En] The function of firewall: simply to release or block certain s…

    Linux 2023年5月27日
    078
  • 面试复盘(1)

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    094
  • HRShell:Flask构建的HTTPS HTTP反向Shell

    https://www.freebuf.com/sectool/212678.html 纸上得来终觉浅,绝知此事要躬行! Original: https://www.cnblogs…

    Linux 2023年5月28日
    0102
  • php发送邮件 (phpmailer)

    1.首先下载phpMailer文件官方文件https://sourceforge.net/projects/phpmailer/; 还有class.smtp.php. 2.去配置一…

    Linux 2023年6月14日
    071
  • EXCEL中vlookup函数的使用

    =LOOKUP(“座”,INDIRECT(“A1:A”&MATCH(E3,B1:B14,))) 这个公式中还嵌套了INDIR…

    Linux 2023年6月13日
    080
  • 网络通信知识地图

    知识地图是一种知识导航系统,并显示不同的知识存储之间重要的动态联系。本篇主要就是从更高的视角将之前的文章的结构思路展现出来。文章结构的思路实际上也是达到架构师程度要掌握的网络通信知…

    Linux 2023年6月14日
    095
  • Xshell中用./startup.sh启动时候提示权限不够

    授予脚本权限 chmod u+x *.sh 或者使用 chmod 777 ./service-demo.sh Original: https://www.cnblogs.com/q…

    Linux 2023年5月28日
    075
  • kubeadm搭建单master k8s集群

    kubeadm搭建单master k8s集群 一、 准备环境 软件环境: 软件 版本 操作系统 CentOS7.9_x64 内核 kernel-ml-5.17.3-1.el7 Do…

    Linux 2023年6月13日
    0108
  • Go实现安全双检锁的方法和最佳实践

    不安全的双检锁 从其他语言转入Go语言的同学经常会陷入一个思考:如何创建一个单例? 有些同学可能会把其它语言中的双检锁模式移植过来,双检锁模式也称为懒汉模式,首次用到的时候才创建实…

    Linux 2023年6月13日
    083
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球