从结构类型中删除元素

时间:2016-01-04 19:35:16

标签: c arrays pointers struct

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

这是我的功能。当我的代码遇到这个函数时,我一直收到这个错误。

  

错误:从'char *'类型指定类型'char [1000]'时出现不兼容的类型

      PhoneBook[iRecord - 1].cFirstName = PhoneBook[x].cFirstName;
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);
    }

这是完整的代码。

#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]);
   }
}

关于我做错了什么的任何建议?

2 个答案:

答案 0 :(得分:2)

数组名称不是可修改的左值。因此,C中的数组不是可分配的

引用C11,章节§6.5.16

  

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

关于可修改的左值,章节§6.3.2.1

  

可修改的左值是一个左值   没有数组类型,[...]

您需要使用strcpy()来复制内容。

答案 1 :(得分:0)

它不会工作strcpy,你必须将整个记录复制到另一个上。然后将电话簿重新分配到新的大小。

#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 ++;
    }
}