如何在C中为电话簿程序添加联系人?

时间:2016-03-01 19:46:30

标签: c

对于我的编程类介绍,我们必须使用C编写电话簿,以便用户添加联系人,以及删除和显示它们。它还必须根据需要分配和释放内存(我试图这样做,但老实说我真的不知道我在做什么)。

无论如何,我无法弄清楚如何在电话簿中添加联系人。到目前为止,我已经粘贴了该计划的相关部分。它会编译,但每次我尝试添加联系人时都会崩溃。一旦我理解了这一点,我想我可以毫不费力地获得其余的功能。如果有人能帮助我,我真的很感激。

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

typedef struct entry {
    char fname[20];
    char lname[20];
    char pnumber[20];
} entry;

// function prototypes
void addentry(int, entry*, char addfname[20], char addlname[20], char addpnumber[20]);

main() {
    int selection = 0;
    int inputtest = 1;
    int pnum = 0; // keeps track of number of contacts

    char addfname[20] = { '\0' };
    char addlname[20] = { '\0' };
    char addpnumber[20] = { '\0' };

    entry *pcontacts;
    pcontacts = (entry*)calloc(1, (sizeof(entry)));

    if (pcontacts == NULL) {
        printf("No memory is available.");
        free(pcontacts);
        return 0;
    }

    while (1) {
        do {
            printf("\nPhonebook Menu\n\n");
            printf("1:\tAdd contact\n");
            printf("2:\tDelete contact\n");
            printf("3:\tDisplay contacts\n");
            printf("4:\tExit\n");
            printf("\nChoose an action (1-4): ");
            scanf("%d", &selection);

            if (selection < 1 || selection > 4) {
                printf("Invalid input. Please enter an integer between 1 and 4.\n");
                inputtest = 0;
            }
            if (selection == 4) {
                free(pcontacts);
                printf("\nThank you for using this phonebook.");
                return 0;
            }
            switch (selection) {
              case 1:
                pnum++;
                printf("\nEnter first name: ");
                scanf("%s", addfname);
                printf("Enter last name: ");
                scanf("%s", addlname);
                printf("Enter phone number (no spaces): ");
                scanf("%s", addpnumber);
                addentry(pnum, pcontacts, addfname[20], addlname[20], addpnumber[20]);
                break;
            }   
        } while (inputtest == 1);   
    }
}

void addentry(int pnum, entry *pcontacts, char addfname[20], char addlname[20], char pnumber[20]) { 

     pcontacts = (entry*)malloc(pnum * (sizeof(entry)));

     if (pcontacts != NULL) {
         strcpy(*pcontacts[pnum - 1].fname, addfname);
         printf("\nContact has been added.");
     } else {
         printf ("No memory is available.\n");
     }
}

1 个答案:

答案 0 :(得分:1)

您可以使用scanf从标准输入中获取字符串,但是您应该告诉scanf要存储到目标数组的最大字节数,以避免缓冲区溢出:

scanf("%19s", addfname);
...
scanf("%19s", addlname);
...
scanf("%19s", addpnumber);

您拨打addentry的方式不正确:

addentry(pnum, pcontacts, addfname[20], addlname[20], addpnumber[20]);

您实际上是在addfnameaddlnameaddpnumber结束后尝试读取该字节。您应该自己传递数组,这些数组将作为指向其第一个字节的指针传递给函数addentry

addentry(pnum, pcontacts, addfname, addlname, addpnumber);

addentry应使用realloc重新分配数组。应该传递一个指向数组指针的指针,它可以更新main中的指针。

addentry不能正确复制字符串:它只复制一个字符串,但语法错误。

以下是更正后的版本:

void addentry(int, entry**, char addfname[20], char addlname[20], char addpnumber[20]);

int main(void) {
    int selection = 0;
    int inputtest = 1;
    int pnum = 0; // keeps track of number of contacts

    char addfname[20];
    char addlname[20];
    char addpnumber[20];

    entry *pcontacts = NULL;

    for (;;) {
        do {
            printf("\nPhonebook Menu\n\n");
            printf("1:\tAdd contact\n");
            printf("2:\tDelete contact\n");
            printf("3:\tDisplay contacts\n");
            printf("4:\tExit\n");
            printf("\nChoose an action (1-4): ");
            scanf("%d", &selection);

            if (selection < 1 || selection > 4) {
                printf("Invalid input. Please enter an integer between 1 and 4.\n");
                inputtest = 0;
            }
            if (selection == 4) {
                free(pcontacts);  /* OK for NULL */
                printf("\nThank you for using this phonebook.");
                return 0;
            }
            switch (selection) {
              case 1:
                printf("\nEnter first name: ");
                scanf("%19s", addfname);
                printf("Enter last name: ");
                scanf("%19s", addlname);
                printf("Enter phone number (no spaces): ");
                scanf("%19s", addpnumber);
                addentry(pnum, &pcontacts, addfname, addlname, addpnumber);
                pnum++;
                break;
            }   
        } while (inputtest == 1);   
    }
}

/* add an entry at position pnum */
void addentry(int pnum, entry **pp, char addfname[20], char addlname[20], char pnumber[20]) {

     entry *pcontact = *pp;
     pcontacts = realloc(pcontacts, (pnum + 1) * sizeof(entry));

     if (pcontacts != NULL) {
         *pp = pcontacts; /* update pointer in main */
         strcpy(pcontacts[pnum].fname, addfname);
         strcpy(pcontacts[pnum].lname, addlname);
         strcpy(pcontacts[pnum].pnumber, addpnumber);
         printf("\nContact has been added.");
     } else {
         printf ("No memory is available.\n");
     }
}