C 从结构类型中删除元素

C 从结构类型中删除元素,c,arrays,pointers,struct,C,Arrays,Pointers,Struct,我试图创建此函数以从指针结构数组类型中删除用户选择的元素 这是我的功能。当我的代码碰到这个函数时,我总是会遇到这个错误 错误:从类型“char*”分配给类型“char[1000]”时,类型不兼容 PhoneBook[iRecord - 1].cFirstName = PhoneBook[x].cFirstName; void delete_记录(pb*电话簿) { int x; int iRecord=0; 打印(电话簿); printf(“\n输入要删除的记录的编号:”); sc

我试图创建此函数以从指针结构数组类型中删除用户选择的元素

这是我的功能。当我的代码碰到这个函数时,我总是会遇到这个错误

错误:从类型“char*”分配给类型“char[1000]”时,类型不兼容

      PhoneBook[iRecord - 1].cFirstName = PhoneBook[x].cFirstName;
void delete_记录(pb*电话簿)
{
int x;
int iRecord=0;
打印(电话簿);
printf(“\n输入要删除的记录的编号:”);
scanf(“%d”和&i记录);
printf(“\n要删除的记录:%d.%s\n”,iRecord-1,电话簿[iRecord-1].cFirstName);

对于(x=strlen(电话簿[iRecord-1].cFirstName);x数组名不是可修改的左值。因此,数组不能在
C
中分配

引用第§6.5.16章C11

赋值运算符应具有可修改的左值作为其左操作数

关于可修改左值,第§6.3.2.1章

可修改左值是指 没有数组类型[…]


您需要改为使用来复制内容。

它无法正常工作,您必须将整个记录复制到另一个记录上。然后将电话簿重新定位到新的大小

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

typedef struct phonebook {
    char cFirstName[50];
    char cLastName[50];
    char cNumber[50];
} pb;

int     entry();
void    modify();
void    delete_record();
void    print_record(int rec);
void    print();
void    convert_u(char *);

//global variables
int     MAX_NAME_ENTRY = 0;
pb      *PhoneBook  = NULL;

#define     YES     "YES"
#define     NO      "NO"





const char *menu=
                " Phonebook Menu             \n"
                " ****************           \n"
                "                            \n"
                " 1. Enter new contact       \n"
                " 2. Modify existing contact \n"
                " 3. Delete contact          \n"
                " 4. Print Phonebook         \n"
                " 5. Exit                    \n"
                "                            \n"
                " Please make selection: ";



int main(void){

   int      iResponse   = 0;



   do {


      printf("%s",menu);
      scanf("%d", &iResponse);

      switch (iResponse) {
          case  1:
                entry();
                break;
          case  2:
                modify();
                break;
          case  3:
                delete_record();
                break;
          case  4:
                print();

      }

   }  while (iResponse != 5);

   free(PhoneBook);
   return 0;
}


int str_input(const char *text, char *buff){
    printf("%s" , text);
    scanf("%s"  , buff);
}

int entry(void)
{
    int     x;
    char    yes_no[] = YES;
    pb      *newPhoneBook;



    if (MAX_NAME_ENTRY == 10) {
      printf("\nMax Number of names entered.\n");
      return 0;
    }  

    while(1) {


    newPhoneBook = realloc(PhoneBook,(MAX_NAME_ENTRY +1) * sizeof(pb)) ;


    if (!newPhoneBook) {
        perror("entry::realloc()");
        return 1;
    }


    PhoneBook = newPhoneBook;






    if (MAX_NAME_ENTRY == 9) {
        printf("\n *** This is the Last entry. *** \n");
    }  

    printf("RECORD: %d\n",MAX_NAME_ENTRY+1);

    str_input("\nFirst Name: "      , PhoneBook[MAX_NAME_ENTRY].cFirstName);
    str_input("\nLast Name: "       , PhoneBook[MAX_NAME_ENTRY].cLastName);
    str_input("\nPhone Number: "    , PhoneBook[MAX_NAME_ENTRY].cNumber);


    MAX_NAME_ENTRY++;

    if(MAX_NAME_ENTRY == 10) 
        break;

    printf("\nAnother entry(yes/no)? ");
    scanf("%s", yes_no);
    convert_u(yes_no);

    if (strcmp(yes_no, YES))
        break;

    system("clear");

   } 

}

int checkRecordExists(int iRecord){
    if(iRecord<1 || iRecord>MAX_NAME_ENTRY){
        printf("Record %d do not exists\n",iRecord);
        return 0;
    }
    return 1;
}

void modify(void){

    int  iModify = 0;
    char name_num[6] = {'\0'};

    printf("\nWhich entry would you like to modify? ");
    scanf("%d", &iModify);
    if(!checkRecordExists(iModify))
        return;

    iModify --;
    print_record(iModify);

    str_input("\nModify name or number? ", name_num);

    convert_u(name_num);

    if (strcmp(name_num, "NAME") == 0) {
        str_input("\nFirst Name: "      , PhoneBook[iModify].cFirstName);
        str_input("\nLast Name: "       , PhoneBook[iModify].cLastName);
    }
    else if (strcmp(name_num, "NUMBER") == 0) {
        str_input("\nPhone Number: "    , PhoneBook[iModify].cNumber);;
    }

}

void delete_record(void)
{
   int x;
   int iRecord = 0;


   printf("\nEnter number of record you want to delete: ");
   scanf("%d", &iRecord);

   if(!checkRecordExists(iRecord))
        return;


   iRecord--;

   MAX_NAME_ENTRY--;

   for( x=iRecord;x<MAX_NAME_ENTRY;x++)
        memcpy(&PhoneBook[x],&PhoneBook[x+1],sizeof(pb));

    PhoneBook = realloc(PhoneBook,(MAX_NAME_ENTRY + 1) * sizeof(*PhoneBook)  ); 
}


void print_record(int rec){

      printf("\n"
             "%02d. Name: %s %s\n"
             "    Number: %s\n"
             "\n",
             rec + 1, PhoneBook[rec].cFirstName, PhoneBook[rec].cLastName, PhoneBook[rec].cNumber);
   }

}
void print(void){
   int x;
   for (x = 0 ; x < MAX_NAME_ENTRY ; x++) { 
      print_record(x);
   }
}


void convert_u(char *string){
    while(*string){
        *string = toupper(*string);
        string ++;
    }
}
#包括
#包括
#包括
#包括
typedef结构电话簿{
char cFirstName[50];
字符名称[50];
字符数[50];
}铅;
int entry();
无效修改();
作废删除_记录();
作废打印记录(int rec);
作废打印();
void convert_(char*);
//全局变量
int MAX_NAME_ENTRY=0;
pb*电话簿=空;
#定义是“是”
#定义“否”
常量字符*菜单=
“电话簿菜单\n”
“******************\n”
“\n”
“1.输入新联系人\n”
“2.修改现有联系人\n”
“3.删除联系人\n”
“4.打印电话簿\n”
“5.退出\n”
“\n”
“请选择:”;
内部主(空){
int i响应=0;
做{
printf(“%s”,菜单);
scanf(“%d”和&i响应);
开关(i响应){
案例1:
条目();
打破
案例2:
修饰();
打破
案例3:
删除_记录();
打破
案例4:
打印();
}
}而(i响应!=5);
免费(电话簿);
返回0;
}
int str_输入(常量字符*文本,字符*buff){
printf(“%s”,文本);
扫描频率(“%s”,浅黄色);
}
整数输入(无效)
{
int x;
char yes_no[]=是;
pb*新电话簿;
如果(最大名称项==10){
printf(“\n输入的名称的最大数目。\n”);
返回0;
}  
而(1){
newPhoneBook=realloc(电话簿,(最大姓名输入+1)*sizeof(pb));
如果(!新电话簿){
perror(“entry::realloc()”;
返回1;
}
电话簿=新电话簿;
如果(最大名称项==9){
printf(“\n***这是最后一个条目。***\n”);
}  
printf(“记录:%d\n”,最大名称项+1);
str\u输入(“\n名字:”,电话簿[MAX\u Name\u ENTRY].cFirstName);
str\u输入(“\n上一个姓名:”,电话簿[MAX\u Name\u ENTRY];
str_输入(“\n电话号码:”,电话簿[MAX_NAME_ENTRY].cNumber);
MAX_NAME_ENTRY++;
如果(最大名称项==10)
打破
printf(“\n其他条目(是/否)?”;
scanf(“%s”,是/否);
转换(是/否);
如果(strcmp(是\否,是))
打破
系统(“清除”);
} 
}
int checkRecordExists(int iRecord){
如果(iRecordMAX\u NAME\u条目){
printf(“记录%d不存在,\n”,iRecord);
返回0;
}
返回1;
}
作废修改(作废){
int-iModify=0;
字符名_num[6]={'\0'};
printf(“\n要修改哪个条目?”);
scanf(“%d”&iModify);
如果(!checkRecordExists(iModify))
返回;
iModify——;
打印记录(iModify);
str\u输入(“\n修改名称或编号?”,名称\u编号);
转换(名称和数量);
if(strcmp(name_num,“name”)==0){
str_输入(“\n名字:”,电话簿[iModify].cFirstName);
str_输入(“\n姓氏:”,电话簿[iModify].Name);
}
else if(strcmp(name_num,“NUMBER”)==0){
str_输入(“\n电话号码:”,电话簿[iModify].cNumber);;
}
}
作废删除记录(作废)
{
int x;
int iRecord=0;
printf(“\n输入要删除的记录的编号:”);
scanf(“%d”和&i记录);
如果(!checkRecordExists(iRecord))
返回;
iRecord--;
最大名称输入--;

对于(x=iRecord;XT)要复制数组,您需要使用
strcpy
memcpy
。当且仅当数组包含以NUL结尾的字符串时,您可以使用
strcpy
memcpy
可以用于复制任何数组,前提是您知道数组的字节大小。您正在使用
strlen(电话簿[iRecord-1].cFirstName)
好像它与
电话簿
指向的数组中的元素数有关。显然,它不是.strcpy(电话簿[iRecord-1].cFirstName,“\0”);那么,我是否需要将空指针类型复制到电话簿数组类型中?或者这到底是如何工作的?@user3495404为什么要将空指针复制到数组中?如果希望数组中的指针为0,请使用
memset()
。@user3495404,我建议使用
memmove()
一次向下移动尾部的所有元素。这样会更干净,也可能更快。@SouravGhosh所以当我尝试memset()和memmove()时如下所列,它似乎删除或复制了我选择的数组之后的所有元素。因此,例如,如果我的phonebook结构中有三个姓名和号码,并且我选择删除第二个,则这些函数将清空
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

typedef struct phonebook {
   char cFirstName[1000];
   char cLastName[1000];
   char cNumber[1000];
} pb;

int entry(pb *);
void modify(pb *);
void delete_record(pb *);
void print(pb *);
void convert_u(char *);

//global variable
int MAX_NAME_ENTRY = 0;

int main()
{
   int iResponse = 0;
   pb *PhoneBook = (pb *) calloc(0, sizeof(pb));
   
   if (PhoneBook == NULL) {
      printf("\nMemory allocation failed.\n\n");
      return 1;
   }

   do {
      printf("\nPhonebook Menu\n****************\n\n");
      printf("1. Enter new contact\n2. Modify existing contact\n3. Delete contact\n4. Print Phonebook \n5. Exit\n\n");
      printf("Please make selection: ");
      scanf("%d", &iResponse);

      if (iResponse == 1) {
         entry(PhoneBook);
      }
      else if (iResponse == 2) {
         modify(PhoneBook);
      }
      else if (iResponse == 3) {
         delete_record(PhoneBook);
         //printf("\nWorking on it...\n");
      }
      else if (iResponse == 4) {
         print(PhoneBook);
      }
   } while (iResponse != 5);
   
   free(PhoneBook);
   return 0;
}

int entry(pb *PhoneBook)
{
   int x;
   char yes_no[] = "YES";
   pb *newPhoneBook = realloc(PhoneBook, (10 * sizeof(pb)));

   if (newPhoneBook == NULL) {
      printf("\nOut of memory!\n\n");
      return 1;
   }
   else {
      PhoneBook = newPhoneBook;
   }
   if (MAX_NAME_ENTRY == 10) {
      printf("\nMax Number of names entered.\n");
   }  
 
   for (x = MAX_NAME_ENTRY; x < 10; x++) {
      if (MAX_NAME_ENTRY == 9) {
         printf("\nLast entry.\n");
      }  
      if (x > 0) {
         system("clear");
         printf("\nAnother entry(yes/no)? ");
         scanf("%s", yes_no);
         convert_u(yes_no);
      }

      if (strcmp(yes_no, "YES") == 0) {
         printf("\nFirst Name: ");
         scanf("%s", PhoneBook[x].cFirstName);

         printf("\nLast Name: ");
         scanf("%s", PhoneBook[x].cLastName);

         printf("\nPhone Number: ");
         scanf("%s", PhoneBook[x].cNumber);
         MAX_NAME_ENTRY++;
      }
      else if (strcmp(yes_no, "NO") == 0) {
         break;
      }
   }
}

void modify(pb *PhoneBook)
{
   int iModify = 0;
   char name_num[6] = {'\0'};
   print(PhoneBook);
   printf("\nWhich entry would you like to modify? ");
   scanf("%d", &iModify);

   printf("\nModify name or number? ");
   scanf("%s", name_num);
   convert_u(name_num);
   if (strcmp(name_num, "NAME") == 0) {
      printf("\nEnter new name: ");
      scanf("%s %s", PhoneBook[iModify - 1].cFirstName, PhoneBook[iModify - 1].cLastName);
   }
   else if (strcmp(name_num, "NUMBER") == 0) {
      printf("\nEnter new number: ");
      scanf("%s", PhoneBook[iModify - 1].cNumber);
   }
}

void delete_record(pb *PhoneBook)
{
   int x;
   int iRecord = 0;

   print(PhoneBook);
   printf("\nEnter number of record you want to delete: ");
   scanf("%d", &iRecord);

   printf("\nRecord to be deleted: %d. %s\n", iRecord - 1, PhoneBook[iRecord - 1].cFirstName);
   for (x = strlen(PhoneBook[iRecord - 1].cFirstName); x <= strlen(PhoneBook[iRecord - 1].cFirstName); x--) {
      PhoneBook[iRecord - 1].cFirstName = PhoneBook[x].cFirstName;
   }
   printf("\nModified record: %s\n\n",PhoneBook[iRecord - 1].cFirstName);
}

void print(pb *PhoneBook)
{
   int x;
  
   for (x = 0; x < 10; x++) { 
      if (strlen(PhoneBook[x].cFirstName) == 0 && strlen(PhoneBook[x].cLastName) == 0) {
         break;
      }
      printf("\n%d. Name: %s %s", x + 1, PhoneBook[x].cFirstName, PhoneBook[x].cLastName);
      printf("\n   Number: %s\n\n", PhoneBook[x].cNumber);
   }
}
void convert_u(char *string)
{
   int x;
  
   for (x = 0; x < strlen(string); x++) {
      string[x] = toupper(string[x]);
   }
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

typedef struct phonebook {
    char cFirstName[50];
    char cLastName[50];
    char cNumber[50];
} pb;

int     entry();
void    modify();
void    delete_record();
void    print_record(int rec);
void    print();
void    convert_u(char *);

//global variables
int     MAX_NAME_ENTRY = 0;
pb      *PhoneBook  = NULL;

#define     YES     "YES"
#define     NO      "NO"





const char *menu=
                " Phonebook Menu             \n"
                " ****************           \n"
                "                            \n"
                " 1. Enter new contact       \n"
                " 2. Modify existing contact \n"
                " 3. Delete contact          \n"
                " 4. Print Phonebook         \n"
                " 5. Exit                    \n"
                "                            \n"
                " Please make selection: ";



int main(void){

   int      iResponse   = 0;



   do {


      printf("%s",menu);
      scanf("%d", &iResponse);

      switch (iResponse) {
          case  1:
                entry();
                break;
          case  2:
                modify();
                break;
          case  3:
                delete_record();
                break;
          case  4:
                print();

      }

   }  while (iResponse != 5);

   free(PhoneBook);
   return 0;
}


int str_input(const char *text, char *buff){
    printf("%s" , text);
    scanf("%s"  , buff);
}

int entry(void)
{
    int     x;
    char    yes_no[] = YES;
    pb      *newPhoneBook;



    if (MAX_NAME_ENTRY == 10) {
      printf("\nMax Number of names entered.\n");
      return 0;
    }  

    while(1) {


    newPhoneBook = realloc(PhoneBook,(MAX_NAME_ENTRY +1) * sizeof(pb)) ;


    if (!newPhoneBook) {
        perror("entry::realloc()");
        return 1;
    }


    PhoneBook = newPhoneBook;






    if (MAX_NAME_ENTRY == 9) {
        printf("\n *** This is the Last entry. *** \n");
    }  

    printf("RECORD: %d\n",MAX_NAME_ENTRY+1);

    str_input("\nFirst Name: "      , PhoneBook[MAX_NAME_ENTRY].cFirstName);
    str_input("\nLast Name: "       , PhoneBook[MAX_NAME_ENTRY].cLastName);
    str_input("\nPhone Number: "    , PhoneBook[MAX_NAME_ENTRY].cNumber);


    MAX_NAME_ENTRY++;

    if(MAX_NAME_ENTRY == 10) 
        break;

    printf("\nAnother entry(yes/no)? ");
    scanf("%s", yes_no);
    convert_u(yes_no);

    if (strcmp(yes_no, YES))
        break;

    system("clear");

   } 

}

int checkRecordExists(int iRecord){
    if(iRecord<1 || iRecord>MAX_NAME_ENTRY){
        printf("Record %d do not exists\n",iRecord);
        return 0;
    }
    return 1;
}

void modify(void){

    int  iModify = 0;
    char name_num[6] = {'\0'};

    printf("\nWhich entry would you like to modify? ");
    scanf("%d", &iModify);
    if(!checkRecordExists(iModify))
        return;

    iModify --;
    print_record(iModify);

    str_input("\nModify name or number? ", name_num);

    convert_u(name_num);

    if (strcmp(name_num, "NAME") == 0) {
        str_input("\nFirst Name: "      , PhoneBook[iModify].cFirstName);
        str_input("\nLast Name: "       , PhoneBook[iModify].cLastName);
    }
    else if (strcmp(name_num, "NUMBER") == 0) {
        str_input("\nPhone Number: "    , PhoneBook[iModify].cNumber);;
    }

}

void delete_record(void)
{
   int x;
   int iRecord = 0;


   printf("\nEnter number of record you want to delete: ");
   scanf("%d", &iRecord);

   if(!checkRecordExists(iRecord))
        return;


   iRecord--;

   MAX_NAME_ENTRY--;

   for( x=iRecord;x<MAX_NAME_ENTRY;x++)
        memcpy(&PhoneBook[x],&PhoneBook[x+1],sizeof(pb));

    PhoneBook = realloc(PhoneBook,(MAX_NAME_ENTRY + 1) * sizeof(*PhoneBook)  ); 
}


void print_record(int rec){

      printf("\n"
             "%02d. Name: %s %s\n"
             "    Number: %s\n"
             "\n",
             rec + 1, PhoneBook[rec].cFirstName, PhoneBook[rec].cLastName, PhoneBook[rec].cNumber);
   }

}
void print(void){
   int x;
   for (x = 0 ; x < MAX_NAME_ENTRY ; x++) { 
      print_record(x);
   }
}


void convert_u(char *string){
    while(*string){
        *string = toupper(*string);
        string ++;
    }
}