2016-04-10 7 views
1

Bitte versuchen Sie mir zu helfen, ich bin mit diesem Code für eine lange Zeit stecken geblieben und ich brauche etwas Hilfe damit. Also muss dieser Code den Benutzer fragen, wie viel Freunde er hat und eine Reihe von Namen nach der Größe öffnen. Dann gibt es Optionen, um einen der Namen zu ändern und das ganze Array durch andere Freunde zu ändern. Es funktioniert alles gut, aber der Heap-Speicher wurde nicht freigegeben. Ich würde mit DR nachsehen. Erinnerung; bitte hilf mir! :)Einige nicht freigegebene Daten in Code

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define LENGTH 20 

void printsFriends(int friends, char** friendBook); 
void changeFriends(int friends, char** friendsBook); 
int main(void) 
{ 
    int i = 0, num = 0,friends=0; 
    char str[LENGTH]; 
    int flag = 0; 
    int changeTo = 0; 
    printf("Hello friend,how U doin'?\nTell me how many friends do you have?\n"); 
    scanf("%d", &friends); 
    getchar(); 
    char** friendBook = (char**)malloc(sizeof(char*)*friends); 
    changeTo = friends; 
    if (friendBook) 
    { 

     for (i = 0; i < changeTo; i++) 
     { 
      friendBook[i] = malloc(LENGTH*sizeof(char)); 
     } 
     changeFriends(changeTo, friendBook); 
     printsFriends(changeTo, friendBook); 
     while (!flag) 
     { 
      printf("\n\nPlease enter one of options:\n1.Change name of friend\n2.Change number of friends\n3.Exit and free the memory\n"); 
      scanf("%d",&num); 
      getchar(); 
      switch (num) 
      { 
       case 1: 
        printf("What number of friend do you want to change?\n"); 
        scanf("%d", &num); 
        getchar(); 
        printf("Enter name to change for\n"); 
        fgets(str, LENGTH, stdin); 
        str[strcspn(str, "\n")] = 0; 
        friendBook[num - 1] =realloc(friendBook[num-1], (sizeof(char)*(strlen(str) + 1))); 
        if (*(friendBook + num - 1)) 
        { 
         strcpy(*(friendBook + num - 1), str); 
        } 
        printsFriends(changeTo, friendBook); 
        break; 
       case 2: 
        printf("Enter number of friends you want:\n"); 
        scanf("%d", &changeTo); 
        getchar(); 
        friendBook = (char**)realloc(friendBook,sizeof(char*)*changeTo); 
        for (i = 0; i < changeTo; i++) 
        { 
         friendBook[i] = malloc(LENGTH*sizeof(char)); 
        } 
        changeFriends(changeTo,friendBook); 
        printsFriends(changeTo, friendBook);      
        break; 
       case 3: 
        flag = 1; 
        printf("BYE BYE!\n"); 
        break; 
       default: 
        printf("not good choice, enter again\n"); 
        break; 

      } 
     } 
    } 

    for (i = 0; i < changeTo; i++) 
    { 
     free(friendBook[i]); 
    } 
    free(friendBook); 
    system("PAUSE"); 
    return 0; 
} 

/* 
This function get number of friends and friends book pointer to pointer and prints all the names. 
input: number of friends and pointer to pointer of char's(array of strings) 
output: none 
*/ 
void printsFriends(int friends, char** friendBook) 
{ 
    int i = 0; 
    for (i = 0; i < friends; i++) 
    { 
     printf("Friend: %s\tLength of friend name %d\n", friendBook[i], strlen(friendBook[i])); 
    } 
} 
/* 
this function gets number of friends and friends book and save to the array of strings names from stdin by the length of every string. 
input: friends number and array of strings 
output: none 
*/ 
void changeFriends(int friends, char** friendBook) 
{ 
    int i = 0; 
    char str[LENGTH]; 
    for (i = 0; i < friends; i++) 
    { 
     printf("Enter friend number %d: \n", i + 1); 
     fgets(str, LENGTH, stdin); 
     str[strcspn(str, "\n")] = 0; 
     friendBook[i] = realloc(friendBook[i], (sizeof(char)*(strlen(str) + 1)));  // dynamic memory for every string(name) 
     if (friendBook[i]) 
     { 
      strcpy(friendBook[i], str); 
     } 
    } 
} 
+0

Ich bin nicht sicher, was DR ist, aber wenn Sie Linux und 'Valgrind' verwenden, dann führen Sie es mit' --track-origins = yes'. – Enkelli

Antwort

3

Wenn Option Aufruf 2, die alten friendBook[i] Zeiger (für jede i) nicht befreit.

Verwandte Themen