2016-03-01 73 views
-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"); 
    } 
} 
+0

使用調試器來找出崩潰發生。 –

+1

在C函數中,args是按值傳遞的。所以'pcontacts =(entry *)malloc(pnum *(sizeof(entry)));'只設置一個* local *變量,一旦函數退出就會丟失。也就是說,這個功能實際上是一個很大的noop。分配'pnum'條目沒有意義,填入最後一個條目,然後在未初始化之前保留所有其他條目。顯然你需要*添加*到現有的列表/數組/數據結構,而不是做你正在做的事情。 – kaylum

+0

'strcpy(* pcontacts [pnum-1] .fname,addfname);'。這是可能導致你的崩潰的線(除了如上所述在功能上是錯誤的)。它應該是'strcpy(pcontacts [pnum-1] .fname,addfname);' – kaylum

回答

1

你從標準輸入字符串與scanf,但你應該告訴scanf的最大字節數存儲到目標陣列以避免緩衝區溢出:

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

你打電話的方式addentry是不正確:

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

你真正嘗試只是addfname,0123年底後讀取字節和addpnumber。而應該通過陣列本身,將被傳遞給函數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"); 
    } 
} 
相關問題