-4
對於我的編程課程介紹,我們必須編寫一個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");
}
}
使用調試器來找出崩潰發生。 –
在C函數中,args是按值傳遞的。所以'pcontacts =(entry *)malloc(pnum *(sizeof(entry)));'只設置一個* local *變量,一旦函數退出就會丟失。也就是說,這個功能實際上是一個很大的noop。分配'pnum'條目沒有意義,填入最後一個條目,然後在未初始化之前保留所有其他條目。顯然你需要*添加*到現有的列表/數組/數據結構,而不是做你正在做的事情。 – kaylum
'strcpy(* pcontacts [pnum-1] .fname,addfname);'。這是可能導致你的崩潰的線(除了如上所述在功能上是錯誤的)。它應該是'strcpy(pcontacts [pnum-1] .fname,addfname);' – kaylum