2017-02-13 5 views
0

配列に文字列を挿入できるように、特定のインデックスのすべての要素を動的に割り当てられたchar **の右側に移動する必要があります。cで動的に割り当てられたchar **ポインタの右に要素を移動する方法は?正しい軌道にいるのですか?

特定のインデックスに格納されている文字列を横断して右に移動する方法が混乱していますか?

この関数は、インデックスと、構造体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++; 
} 

編集:あなたはあなたの最後の項目は常に(SA->サイズ - 1)でなければならないことに気づくはずです。次に、最後から目的の位置に繰り返します。

+0

これは、挿入されていたものと同じ文字列全体を設定します。この種のシナリオでは、他の値を上書きしないために一時変数が必要ですか?また、1Dアレイのように横断しますか?私はこれを正しく理解していることを確認しようとしています。 :) – starlight

+0

@starlightしかし配列*は "1次元"配列です。それはポインタの配列はいですが、それはまだ1次元の配列です。 –

+0

**のため2D配列になると思っていました。私はこれがどうやって混乱しているのかと思う。 – starlight

関連する問題