徐凤年_ 2023-04-24 15:35 采纳率: 33.3%
浏览 14
已结题

c++通讯录系统显示空白或者pp,

通讯录系统 显示名字和地址的时候显示空白或者pp,不可以正常显示汉字也不报错这怎么改正​

#include<iostream>
using namespace std;
#include<string>
#include<windows.h>
#define MAX 1000

//1.菜单界面
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;

}
struct Person
{
    string m_Name;//姓名
    int m_Sex = 0;//1.男 2.女输入其他就错了,如果为string可能有输入其他
    int m_Age = 0;//年龄
    string m_Phone;//联系电话
    string m_Addr;//家庭住址
};
struct Addressbooks
{
    //通讯录中保存的联系人数组
    struct Person personArray[MAX];
    //通讯录中当前记录联系人个数
    int m_Size = 0;
};
//2. 添加加联系人
void addPerson(Addressbooks* abs)
{
    //判断通讯录是否已满,如果满了就无法添加
    if (abs->m_Size == MAX)
    {
        //为避免用户不知道满了,添加已满输出语句
        cout << " 通讯录已满,无法继续添加!" << endl;
        return;//满了之后直接返回
    }
    else 
    {
        //添加具体联系人

        //姓名
        string name;
        cout << " 请输入用户姓名:" << endl;
        cin >> name;
        //abs的联系人数组 的第几个联系人 的名字等于 函数中姓名
        abs->personArray[abs->m_Size].m_Name = name;
        //性别
        int sex = 0;
        cout << " 请输入该用户性别:" << endl;
        cout << " 1 --- 男" << endl;
        cout << " 2 --- 女" << endl;
        while (1)//保证大括号内循环一直执行,除非输入正确12才跳出 否则一直循环。
        {
            cin >> sex;
            if (sex == 1 || sex == 2)//如果输入12
            {
                abs->personArray[abs->m_Size].m_Sex = sex;
                break;//输入正确性别,跳出循环
            }
            cout << " 输入有误,请重新输入!" << endl;
        }
        //年龄
        int age = 0;
        cout << " 请输入该用户年龄:" << endl;
        cin >> age;
        abs->personArray[abs->m_Size].m_Age = age;
        //联系电话
        cout << " 请输入该用户联系电话:" << endl;
        string phone;
        cin >> phone;
        abs->personArray[abs->m_Size].m_Phone = phone;

        //家庭住址
        string address;
        cout << " 请输入该用户家庭住址:" << endl;
        cin >> address;
        abs->personArray[abs->m_Size].m_Addr = address;
        //更新通讯录人数
        abs->m_Size++;
        cout << " 添加成功!" << endl;

        system("pause");//按任意键继续
        system("cls");//清屏操作
    }
}
//3.显示联系人
void showPerson(Addressbooks* abs)
{
    //判断通讯录中人数是非为0,如果为0则提示记录为空
    if (abs->m_Size == 0)
    {
        cout << " 当前的记录为空!" << endl;
    }
    //如果不为0则显示已存在的联系人
    else 
    {
        //循环输出 abs->m_Size 个已有联系人
        for (int i = 0; i < abs->m_Size; i++)
        {
            cout << i + 1 << ".姓名:" << abs->personArray[i].m_Name << "\t";
            //利用三目运算符如果值为1则输出男,否则输出女
            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");
}
//4.检测目标联系人是否存在,如果存在返回联系人所在数组中当前位置,不存在,则返回-1
//                参数1 通讯录  参数2 对比姓名
int isExist(Addressbooks* abs, string name)//指针(地址传递修改实参)
{
    //遍历当前所有联系人
    for (int i = 0; i < abs->m_Size; i++)
    {
        //如果存在目标联系人
        if (abs->personArray[i].m_Name == name)
        {
            return i;//返回目标联系人当前位置
        }
    }
        return -1;//遍历结束,都没找到,则不存在,返回-1
}
//5.删除联系人函数
void deletePerson(Addressbooks* abs)//对实参修改,用地址传递,需要用指针接收
{
    cout << "请输入您要删除的联系人:" << endl; 
    string name;
    cin >> name;

    int ret = isExist(abs, name);//接收当联系人所在的位置
    if (ret != -1)//联系人存在则删除  
    {
        for (int i = ret; i < abs->m_Size; i++)
        {
            abs->personArray[i] = abs->personArray[i + 1];//即将当前联系人后面的所有联系人往前移 1 ,覆盖掉即可
        }
        abs->m_Size--;//迁移后通讯录总人数 -1
        cout << " 删除成功!" << endl;
    }
    else 
    {
        cout << " 查无此人!" << endl;
    }
    //清屏操作
    system("pause");
    system("cls");
}
//6.查找联系人函数
void findPerson(Addressbooks* abs)
{
    cout << "请输入您要查找的联系人:" << endl;
    string name;
    cin >> name;
    //判断指定联系人是否存在
    int ret =isExist(abs, name);
    if(ret != -1)
    {
        //存在则输出指定联系人信息
        cout << " 姓名:" << abs->personArray[ret].m_Name << "\t";
        //利用三目运算符如果值为1则输出男,否则输出女
        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的联系人数组 的第几个联系人 的名字等于 函数中姓名
        abs->personArray[ret].m_Name = name;
        //性别
        int sex = 0;
        cout << " 请输入该用户性别:" << endl;
        cout << " 1 --- 男" << endl;
        cout << " 2 --- 女" << endl;
        while (1)//保证大括号内循环一直执行,除非输入正确12才跳出 否则一直循环。
        {
            cin >> sex;
            if (sex == 1 || sex == 2)//如果输入12
            {
                abs->personArray[ret].m_Sex = sex;
                break;//输入正确性别,跳出循环
            }
            cout << " 输入有误,请重新输入!" << endl;
        }
        //年龄
        int age = 0;
        cout << " 请输入该用户年龄:" << endl;
        cin >> age;
        abs->personArray[ret].m_Age = age;
        //联系电话
        cout << " 请输入该用户联系电话:" << endl;
        string phone;
        cin >> phone;
        abs->personArray[ret].m_Phone = phone;

        //家庭住址
        string address;
        cout << " 请输入该用户家庭住址:" << endl;
        cin >> address;
        abs->personArray[ret].m_Addr = address;
        cout << " 修改成功!" << endl;

    }
    else
    {
        cout << " 查无此人!" << endl;
    }
    system("pause");//按任意键继续
    system("cls");//清屏操作
}
void clearPerson(Addressbooks *abs)
{
    abs->m_Size = 0;
    cout << " 通讯录已清空!" << endl;
    system("pause");//按任意键继续
    system("cls");//清屏操作
}
int main() 
{
    Addressbooks abs;
    int select = 0;//创建用户选择输入的变量
    
    //除非用户输入 0 否则不退出系统
    while (true)
    {
        //菜单调用
        showMenu();
        cin >> select;
        switch (select)
        {
        case 1://添加联系人 上限为1000人信息包括(姓名,性别,年龄,联系电话,家庭住址)
            addPerson(&abs);//利用地址传递确保实参改变,确保传入真实值        
            break;
        case 2://显示联系人
            showPerson(&abs);
            break;
        case 3://删除联系人         如果case后语句多 则用{}将所有语句包括在内
            deletePerson(&abs);//利用地址传递确保实参改变,确保传入真实值
            break;
        case 4://查找联系人
            findPerson(&abs);
            break;
        case 5://修改联系人
            modifyPerson(&abs);
            break;
        case 6://清空联系人
            clearPerson(&abs);
            break;
        case 0://退出通讯录
            cout << " 欢迎下次使用!" << endl;
            system("pause");
            return 0;
            break;
        default:
            break;
        }
    }
    

    system("pause");
    return 0;
}

代码是这样的然后我输入一个名字

img

 显示的时候是这样的

img

 

  • 写回答

2条回答 默认 最新

  • 源客V 2023-04-24 16:51
    关注

    可能是因为使用了 cin 去读取汉字的输入,而 cin 对于汉字的支持不太好,会出现一些问题。建议改用 getline(cin, variable) 来代替 cin 获取输入字符串,这样就能够正常地获取汉字了。
    代码示例:

    string name;
    cout << "请输入用户姓名:" << endl;
    getline(cin, name);
    abs->personArray[abs->m_Size].m_Name = name; 
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月2日
  • 已采纳回答 4月24日
  • 创建了问题 4月24日

悬赏问题

  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测