2016-12-20 3 views
1

Я пытаюсь добавить строку в массив, но я не уверен, почему этот код не работает. Кто-нибудь, пожалуйста, оставит мне отзыв?Как добавить строку в массив строк в c?

/* Exercise b: Add <string> to the end of array <array>. 
* Returns: pointer to the array after the string has been added. 
*/ 
char **add_string(char **array, const char *string) { 
    /*reallocate so the array of strings can hold one more string*/ 
    char** newArray = realloc(array, sizeof (array) + sizeof (char*)); 
    if (!newArray) return array; 

    /*allocate memory for new string*/ 
    char* newString = malloc(strlen(string) * sizeof (char)); 
    if (!newString) return newArray; 

    /*copy old string to new string*/ 
    int lastIndex = sizeof (newArray)/sizeof (char*); 
    strncpy(newString,string,strlen(string)); 

    /*null terminate array and set old end of array to new string*/ 
    newArray[lastIndex] = NULL; 
    newArray[lastIndex-1] = newString; 

    return newArray; 
} 

Когда я запускаю код, ядро ​​свалки, но я не понимаю, почему

Причина, почему я спрашиваю, потому что я знаю, что это было бы легко пройти в размер массива , Но для этого метода я не допущен. Unfortunatley, мой профессор говорит, что параметры fuction должны оставаться неизменными

+0

Вы можете попробовать отладки кода - например, начать распечатку 'SizeOf (массив)' и 'lastIndex' и увидеть, если они принимают значения, которые вы ожидаете. –

+3

'sizeof (newArray)', который не делает то, что вы хотите. 'sizeof' на указателе дает размер указателя, а не размер массива (потому что на самом деле он не является массивом C-указателей и массивов на C, хотя во многих случаях они ведут себя одинаково). – kaylum

+0

Возможный дубликат [Как найти «sizeof» (указатель, указывающий на массив)?] (Http://stackoverflow.com/questions/492384/how-to-find-the-sizeofa-pointer-pointingtoto -an-array) – kaylum

ответ

0

Есть несколько вещей, которые неправильно, например. sizeof (array) + sizeof (char*), где sizeof(array) является неправильным, и + также (должно быть *); и все остальные комментарии выше также применяются.

Написал решение и оставил ваш код в виде комментариев; см. различия.

/* Exercise b: Add <string> to the end of array <array>. 
* Returns: pointer to the array after the string has been added. 
*/ 
char **add_string(char **array, const char *string) { 

    int lastIndex = 0; 
    while (array[lastIndex] != nullptr) 
     lastIndex++; 

    /*reallocate so the array of strings can hold one more string; note that lastIndex is zero-based; hence, the size of the current array is lastIndex+1, and consequently the size of the new array needs to be lastIndex+2 */ 
    // char** newArray = (char**)realloc(array, sizeof (array) + sizeof (char*)); 
    char** newArray = (char**)realloc(array, (lastIndex+2) * sizeof (char*)); 
    if (!newArray) return array; 

    /*allocate memory for new string*/ 
    char* newString = strdup(string); 
    //char* newString = malloc(strlen(string) * sizeof (char)); 
    if (!newString) return newArray; 

    /*copy old string to new string*/ 
    //int lastIndex = sizeof (newArray)/sizeof (char*); 
    //strncpy(newString,string,strlen(string)); 


    /*null terminate array and set old end of array to new string*/ 
    //newArray[lastIndex] = NULL; 
    //newArray[lastIndex-1] = newString; 

    newArray[lastIndex++] = newString; 
    newArray[lastIndex] = nullptr; 

    return newArray; 
} 

void printArray (char** array) { 
    char* str; int i=0; 
    while ((str = array[i]) != nullptr) { 
     std::cout << i << ":" << str << std::endl; 
     i++; 
    } 
} 

int main() { 

    char** myArray = (char**) malloc(1 * sizeof(char*)); 
    myArray[0] = nullptr; 

    std::cout << "empty:" << std::endl; 
    printArray (myArray); 

    myArray = add_string(myArray, "Tom"); 
    std::cout << "one element:" << std::endl; 
    printArray (myArray); 

    myArray = add_string(myArray, "Jerry"); 
    myArray = add_string(myArray, "Fin"); 
    std::cout << "three elements:" << std::endl; 
    printArray (myArray); 

    return 0; 
} 
+0

Я не уверен, что если у меня просто плохой день, ядро ​​все еще сбрасывает этот код? – yasgur99

+0

Возможно, он должен делать то, как вы вызываете функцию; добавлен пример. –

+0

@ M.M: Спасибо; Кажется, я не должен публиковать ответы поздно ночью :-) –