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

 

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

string name;
cout << "请输入用户姓名:" << endl;
getline(cin, name);
abs->personArray[abs->m_Size].m_Name = name; 
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/353832
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:C++解决给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出
  • 除此之外, 这篇博客: C++语句复习题以及知识讲解中的 1.5 下面显示的每个程序都有一个常见的编译错误,指出错误在哪里,然后修改它。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    unsigned evencnt=0,oddcnt=0;
    int digit = get_num()%10;
    switch(digit)
    {
        case 1,3,5,7,9:
            oddcnt++;
            break;
        case 2,4,6,8,10;
            evencnt++;
            break;
    }

    上述代码错误在一个case只可以对于一个值,不可以一个对应多个值

    更改后的代码如下所示:

    unsigned evencnt=0,oddcnt=0;
    int digit = get_num()%10;
    switch(digit)
    {
        case 1:
        case 3:
        case 5:
        case 7:
        case 9:
            oddcnt++;
            break;
        case 2:
        case 4:
        case 6:
        case 8:
        case 10:
            evencnt++;
            break;
    }
    unsigned ival=521, jval=1024,kval=1225;
    unsigned bufsize;
    unsigned swt = get_bufCnt();
    switch(swt)
    {
        case ival:
            bufsize = ival*sizeof(int);
            break;
        case jval:
            bufsize = jval*sizeof(int);
            break;
        case kval:
            bufsize = kval*sizeof(int);
            break;
    }

    上述代码错误在使用变量作为case标签内容,C++规定,case标签的内容只能是整型常量表达式。修改后的程序如下所示:(只需将变量更改为常量即可用const)

    const unsigned ival=521, jval=1024,kval=1225;
    unsigned bufsize;
    unsigned swt = get_bufCnt();
    switch(swt)
    {
        case ival:
            bufsize = ival*sizeof(int);
            break;
        case jval:
            bufsize = jval*sizeof(int);
            break;
        case kval:
            bufsize = kval*sizeof(int);
            break;
    }
  • 您还可以看一下 夏曹俊老师的C++ 11 14 17 20内存管理-指针、智能指针和内存池课程中的 图示进程的内存空间划分分析代码区_堆栈_内核空间小节, 巩固相关知识点

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^