Qhhhlu 2022-04-10 14:34 采纳率: 50%
浏览 32
已结题

int类型和指针不兼容怎么算

问题遇到的现象和发生背景

通讯录系统最后一个通讯录排序运行

问题相关代码,请勿粘贴截图

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct people {//定义联系人结构体
char name[20];//名字
char tel[20];//电话
}P;
P num[100];//定义结构体数组,可以存100个联系人的信息
int i=0;//用于作联系人的序号,或者可以判断联系人个数是否到达了最大值

//函数声明
void menu();
void add();
void del();
void find();
void edit();
void print();
void listbyname()
int main() {
system("通讯录管理系统");
int in;//选择值
while (1) {
menu();//菜单
scanf("%d", &in);
switch (in) {
case 0:return 0; //退出系统
case 1:add(); break; //添加联系人
case 2:del(); break; //删除联系人
case 3:find(); break; //查找联系人
case 4:edit(); break; //编辑联系人
case 5:print(); break; //打印通讯录
default:printf("输入错误,请重新输入:\n"); break;
}
}
return 0;
}

//菜单
void menu() {

printf("\t通讯录管理系统\n");
printf("\t 0.退出通讯录\n");
printf("\t 1.添加联系人\n");
printf("\t 2.删除联系人\n");
printf("\t 3.查找联系人\n");
printf("\t 4.修改联系人\n");
printf("\t 5.查看通讯录\n");

printf("请选择:");

}
//与用户交互、显示输出的话语(我这里是将函数里的输出语句都写在了一个函数里,通过调用来显示,让函数显得整洁一点)

//判断字符串是否相等,用于查询、删除、编辑等操作
int my_strcmp(char name[],int j) { //接收输入的名字与该结构体数组下标
char* p1 = name; //strcmp参数是指针,所以将他们用指针表示
char* p2 = (char*)&num[j];
return 0;
}
//打印单个人的信息,用于删除和编辑操作
void print2(int j) {
printf("序号\t姓名\t\t电话\n");
printf("%2d\t%s\t\t%s\n", (j+1),num[j].name, num[j].tel);
}
//1.增加联系人
void add() {
if (i > 100) { //如果通讯录满了就不能在添加了
printf("该通讯录已经装满了!\n"); //警告提示
return;
}
char chose; //用于判断是否要继续添加
while (1) {
printf("请输入联系人的姓名:\n"); //提示输入名字
scanf("%s", &num[i].name);
getchar(); //清除缓存区
printf("请输入联系人的电话:\n"); //提示输入电话
scanf("%s", &num[i].tel);
getchar(); //清除缓冲区
i++; //添加一个联系人就加一
printf("添加成功!是否继续添加 Y/N:\n"); //提示是否继续添加
scanf("%c", &chose);
if (chose = 'y' || chose = 'Y') { //选择y或Y就继续添加,其他值退出
continue; //结束本次循环,回到判断条件处
}
return;
}
}
//删除的详细操作,将该联系人的信息变成后一个联系人,就算删除成功
void del2(int j) {
for (j; j < i; j++) {
num[j] = num[j + 1];
}
}
//2.删除联系人
void del() {
if (i =0) { //判断当前是否有联系人
printf("当前没有联系人!\n");
return;
}
char name[20]; //用来接收输入的要删除的联系人姓名
int chose=0; //用作判断
printf("请输入要删除的联系人姓名:\n"); //删除的姓名
scanf("%s", name);
for (int j = 0; j < i; j++) {
if (my_strcmp(name,j) = 0) { //在数组里查找与输入名相同的元素
printf("确认删除以下信息?\n"); //提示当前联系人信息
print2(j); //显示当前的联系人信息
printf("1.确认 2.返回\n"); //提示是否确认删除
scanf("%d", &chose);
if (chose = 1) {
del2(j); //进行删除操作
printf("删除成功!\n"); //提示删除成功
i-; //联系人的个数要减一
return;
}
}
}
printf("没有找到该联系人!\n"); //没有找到目标,提示没有此人
return;
}
//3.查找
void find() {
if (i = 0) { //判断当前是否有联系人
printf("当前没有联系人!\n");
return;
}
printf("请输入要查找的联系人姓名:\n"); //提示输入查找姓名
char name[20]; //接收姓名
scanf("%s", name);
for (int j = 0; j < i; j++) {
if (my_strcmp(name,j) = 0) { //查找与输入姓名相同的元素
printf("查找成功!\n"); //提示找到了目标联系人
print2(j); //显示该联系人的信息
return;
}
}
printf("经查无此人!\n"); //提示没有找到联系人
}
//4.修改
void edit() {
if (i = 0) { //判断当前是否有联系人
printf("当前没有联系人!\n");
return;
}
printf("请输入要修改的联系人姓名:\n"); //输入编辑姓名
char name[20]; //接收姓名
char chose; //用于选择
scanf("%s", name);
getchar(); //清除缓存区
for (int j = 0; j < i; j++) {
if (my_strcmp(name, j) = 0) { //查找与输入姓名相同的元素
printf("当前联系人信息为:\n"); //提示找到此人
print2(j); //输入此人信息
printf("是否确认修改?Y/N:\n"); //提示是否确认编辑
scanf("%c", &chose); //输入选择
if (chose ='y' || chose = Y') {
printf("请输入新的姓名:\n"); //提示输入新姓名
scanf("%s", &num[j].name); //输入新姓名
printf("请输入新的电话:\n"); //提示输入新电话
scanf("%s", &num[j].tel); //输入新电话
printf("修改成功!当前联系人信息为:\n"); //提示编辑成功
print2(j); //显示新联系人信息
return;
}
}
}
printf("没有该联系人!\n"); //提示没有此人
}
//5.显示通讯录
void print() {
if (i = 0) { //判断当前是否有联系人
printf("当前没有联系人!\n");
return;
}
int j = 0; //作数组下标,从第一个元素开始输出
printf("序号\t姓名\t\t电话\n");
for (j = 0; j < i; j++) {
printf("%2d\t%s\t\t%s\n", (j + 1), num[j].name, num[j].tel);
}
}

void listbyname()//按姓名排序,冒泡排序
{
int i, j;
struct people temp;//person是之前定义的结构体
for(i=0;i<num-1;i++)//num为通讯录中联系人的个数(int和*P不兼容)
{
for (j = 0; j < num - 1 - i; j++)
{
if (strcmp(num[j].name, num[j + 1].name) > 0)// strcmp为字符串比较(头文件为<string.h>)
{
temp = num[j];
num[j] = num[j + 1];
num[j + 1] = temp;
}
}
}
}

运行结果及报错内容

姓名排序 for(i=0;i<num-1;i++) int类型与指针不兼容怎么改

我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

1条回答 默认 最新

  • qzjhjxj 2022-04-10 20:54
    关注

    整体修改如下,修改处见注释语句,供参考:

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    typedef struct people {//定义联系人结构体
            char name[20]; //名字
            char tel[20];  //电话
    }P;
    P num[100];//定义结构体数组,可以存100个联系人的信息
    int i = 0;//用于作联系人的序号,或者可以判断联系人个数是否到达了最大值
    
    //函数声明
    void menu();
    void add();
    void del();
    void find();
    void edit();
    void print();
    void listbyname();
    
    int main() {
        system("通讯录管理系统");
        int in;//选择值
        while (1) {
              menu();//菜单
              scanf("%d", &in);
              switch (in) {
                 case 0:return 0; //退出系统
                 case 1:add(); break; //添加联系人
                 case 2:del(); break; //删除联系人
                 case 3:find(); break; //查找联系人
                 case 4:edit(); break; //编辑联系人
                 case 5:print(); break; //打印通讯录
                default:printf("输入错误,请重新输入:\n"); break;
             }
        }
        return 0;
    }
    
    //菜单
    void menu() {
        printf("\t通讯录管理系统\n");
        printf("\t 0.退出通讯录\n");
        printf("\t 1.添加联系人\n");
        printf("\t 2.删除联系人\n");
        printf("\t 3.查找联系人\n");
        printf("\t 4.修改联系人\n");
        printf("\t 5.查看通讯录\n");
     
        printf("请选择:");
    }
    //与用户交互、显示输出的话语(我这里是将函数里的输出语句都写在了一个函数里,
    //通过调用来显示,让函数显得整洁一点)
    
    //判断字符串是否相等,用于查询、删除、编辑等操作
    //int my_strcmp(char name[],int j) { //接收输入的名字与该结构体数组下标
    //    char* p1 = name;               //strcmp参数是指针,所以将他们用指针表示
    //    char* p2 = (char*)&num[j];
    //    return 0;
    //}
    
    //打印单个人的信息,用于删除和编辑操作
    void print2(int j) {
        printf("序号\t姓名\t\t电话\n");
        printf("%2d\t%s\t\t%s\n", (j+1),num[j].name, num[j].tel);
    }
    //1.增加联系人
    void add() {
        if (i > 100) { //如果通讯录满了就不能在添加了
            printf("该通讯录已经装满了!\n"); //警告提示
            return;
        }
        char chose; //用于判断是否要继续添加
        while (1) {
            printf("请输入联系人的姓名:\n"); //提示输入名字
            scanf("%s", num[i].name);
            //scanf("%s", &num[i].name);
            getchar(); //清除缓存区
            printf("请输入联系人的电话:\n"); //提示输入电话
            scanf("%s", num[i].tel);
            //scanf("%s", &num[i].tel);
            getchar(); //清除缓冲区
            i++; //添加一个联系人就加一
            printf("添加成功!是否继续添加 Y/N:\n"); //提示是否继续添加
            scanf("%c", &chose);
            if (chose == 'n' || chose == 'N') { //选择y或Y就继续添加,其他值退出
            //if (chose = 'y' || chose = 'Y')
               break; //continue; //结束本次循环,回到判断条件处
            }
            //return;
        }
    }
    //删除的详细操作,将该联系人的信息变成后一个联系人,就算删除成功
    void del2(int j) {
        for (j; j < i; j++) {
             num[j] = num[j + 1];
        }
    }
    //2.删除联系人
    void del() {
        if (i ==0) { //判断当前是否有联系人
        //if (i =0)
            printf("当前没有联系人!\n");
            return;
        }
        char name[20]; //用来接收输入的要删除的联系人姓名
        int chose=0; //用作判断
        printf("请输入要删除的联系人姓名:\n"); //删除的姓名
        scanf("%s", name);
        for (int j = 0; j < i; j++) {
             if (strcmp(name,num[j].name) == 0) { //在数组里查找与输入名相同的元素
             //if (my_strcmp(name,j) = 0)
                 printf("确认删除以下信息?\n"); //提示当前联系人信息
                 print2(j); //显示当前的联系人信息
                 printf("1.确认 2.返回\n"); //提示是否确认删除
                 scanf("%d", &chose);
                 if (chose = 1) {
                    del2(j); //进行删除操作
                    printf("删除成功!\n"); //提示删除成功
                    i--; //联系人的个数要减一
                    return;
                 }
             }
        }
        printf("没有找到该联系人!\n"); //没有找到目标,提示没有此人
        return;
    }
    //3.查找
    void find() {
        if (i == 0) { //判断当前是否有联系人
        //if (i = 0)
           printf("当前没有联系人!\n");
           return;
        }
        printf("请输入要查找的联系人姓名:\n"); //提示输入查找姓名
        char name[20]; //接收姓名
        scanf("%s", name);
        for (int j = 0; j < i; j++) {
            if (strcmp(name,num[j].name) == 0) { //查找与输入姓名相同的元素
            //if (my_strcmp(name,j) = 0)
                printf("查找成功!\n"); //提示找到了目标联系人
                print2(j); //显示该联系人的信息
                return;
            }
        }
        printf("经查无此人!\n"); //提示没有找到联系人
    }
    //4.修改
    void edit() {
        if (i == 0) { //判断当前是否有联系人
        //if (i = 0)
           printf("当前没有联系人!\n");
           return;
        }
        printf("请输入要修改的联系人姓名:\n"); //输入编辑姓名
        char name[20]; //接收姓名
        char chose; //用于选择
        scanf("%s", name);
        getchar(); //清除缓存区
        for (int j = 0; j < i; j++) {
            if (strcmp(name, num[j].name) == 0) { //查找与输入姓名相同的元素
            //if (my_strcmp(name, j) = 0)
                printf("当前联系人信息为:\n"); //提示找到此人
                print2(j); //输入此人信息
                printf("是否确认修改?Y/N:\n"); //提示是否确认编辑
                scanf("%c", &chose); //输入选择
                if (chose =='y' || chose == 'Y'){
                //if (chose ='y' || chose = 'Y')
                   printf("请输入新的姓名:\n"); //提示输入新姓名
                   scanf("%s", num[j].name); //输入新姓名
                   //scanf("%s", &num[j].name);
                   printf("请输入新的电话:\n"); //提示输入新电话
                   scanf("%s", num[j].tel); //输入新电话
                   //scanf("%s", &num[j].tel);
                   printf("修改成功!当前联系人信息为:\n"); //提示编辑成功
                   print2(j); //显示新联系人信息
                   return;
                }
            }
        }
        printf("没有该联系人!\n"); //提示没有此人
    }
    //5.显示通讯录
    void print() {
        if (i == 0) { //判断当前是否有联系人
        //if (i = 0)
           printf("当前没有联系人!\n");
           return;
        }
        int j = 0; //作数组下标,从第一个元素开始输出
        printf("序号\t姓名\t\t电话\n");
        for (j = 0; j < i; j++) {
            printf("%2d\t%s\t\t%s\n", (j + 1), num[j].name, num[j].tel);
        }
    }
    
    void listbyname()//按姓名排序,冒泡排序
    {
        int k, j;
        //int i, j;
        struct people temp;//person是之前定义的结构体
        for(k=0;k<i-1;k++)// i 为通讯录中联系人的个数(int和*P不兼容)
        //for(i=0;i<num-1;i++)
        {
            for (j = 0; j < i - 1 - k; j++)
            //for (j = 0; j < num - 1 - i; j++)
            {
                if (strcmp(num[j].name, num[j + 1].name) > 0)// strcmp为字符串比较(头文件为<string.h>)
                {
                    temp = num[j];
                    num[j] = num[j + 1];
                    num[j + 1] = temp;
                }
            }
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月21日
  • 已采纳回答 4月13日
  • 创建了问题 4月10日

悬赏问题

  • ¥15 PointNet++的onnx模型只能使用一次
  • ¥20 西南科技大学数字信号处理
  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。