2017-02-13 23 views
0

Мне нужно сдвинуть все элементы по определенному индексу справа в динамически выделенном символе **, чтобы я мог вставить строку в массив.Как перемещать элементы справа от динамически выделенного указателя char ** в c? Я на правильном пути?

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

Функция получает и int индекс, указатель на структуру SmartArray и строку char * str, которая должна быть вставлена ​​в указанный индекс.

Есть ли я на правильном пути? Это более эффективный способ сделать это?

Это то, что я придумал до сих пор:

char *insertElement(SmartArray *smarty, int index, char *str) 
{ 
    int i; 
    char temp; 

    // Any elements to the right of index are shifted one space to the right., not sure if this is correct way to find strlen 
    for (i = index; i < strlen(smarty->array[index]); i++) 
    { 
    temp = smarty->array[index] 
    if (i == index) 
    { 
     smarty->array[index] = str[i]; 
    } 
    else 
    { 
    smarty->array[index] = temp; 
    } 

    } 

}

Это структура Я работаю с:

typedef struct SmartArray 
{ 
    // We will store an array of strings (i.e., an array of char arrays) 
    char **array; 

    // Size of array (i.e., number of elements that have been added to the array) 
    int size; 

    // Length of the array (i.e., the array's current maximum capacity) 
    int capacity; 

} SmartArray; 
+1

Это хороший прецедент для ['memmove'] (http://en.cppreference.com/w/c/string/byte/memmove). –

+0

Пожалуйста, предоставьте [mcve]. Нам нужно точно определить, как определяются все типы, как распределена память и т. Д. – kaylum

+0

О, и у вас есть очень плохая логическая ошибка в коде, который вы показываете, о чем предупреждает вас хороший компилятор. –

ответ

2

Похоже домашнее задание. Попробуйте проигнорировать тот факт, что sa-> array - это строковый массив. Попробуйте выполнить эту точную операцию над массивом int.

void insert(SmartArray* sa, int indexWhereInsert, char* stringToInsert){ 
    // upper bound of indexWhereInsert? 
    if(!(0 <= indexWhereInsert && indexWhereInsert < sa->size)){ 
    printf("Do something about bounds..."); 
    return; 
    } 

    // Lets make sure there is always space 
    if(sa->capacity < sa->size+1) 
    increaseCapacity(sa); // Usually double it 

    // We move all strings at the right of indexWhereInsert one position to the right 
    for(int index = sa->size - 1 ; index >= indexWhereInsert; index--){ 
    sa->array[index+1] = sa->array[index]; 
    } 

    // Finally we insert the new string 
    sa->array[indexWhereInsert] = stringToInsert; 
    sa->size++; 
} 

Edit: Вы должны заметить, что ваш последний элемент всегда должен быть (SA-> размер - 1). Затем переходите с конца на позицию, представляющую интерес.

+0

Это устанавливает всю строку, равную тому, что было вставлено. Является ли временная переменная необходимой для такого сценария, чтобы не переопределять другие значения? Кроме того, вы поперек его, как 1D-массив? Я просто пытаюсь удостовериться, что понимаю это правильно. :) – starlight

+0

@starlight Но массив * является * одномерным массивом.Это массив указателей да, но это все еще одномерный массив. –

+0

Я думал, что это будет 2D-массив из-за **. Кажется, я так смутился. – starlight