char *

2017-01-10 5 views
0

のメンバーからメンバーを削除countのメンバーをarrのインデックスidxから削除するには、この関数を作成しました。char *

void remove_int(int (*arr)[], int idx, int count) 
{ 
    int i, j; 

    for (i = 0; i < count; i++) 
     for (j = idx; (*arr)[j]; j++) 
      (*arr)[j] = (*arr)[j+1]; 
} 

私はこのようにそれを呼び出す:

remove_int(&arr, index, cnt); 

これはローカル整数のために完璧に動作します。ここに私の問題がある。 array

struct { 
    /* other stuff */ 
    char *array[100]; 
} global_struct; 

メンバーが割り当てられ、満たされている:私はこのようなヘッダファイルを持っています。

誰かが、私はちょうど呼び出し、その後、char *(*arr)[]charint (*arr)[]intを切り替えることができ考え出し:

remove_char(&global_struct.array, index, cnt); 

が、私はそれを試してみましたが、それは実際にglobal_struct.arrayを変更しません。 remove_intglobal_struct.arrayと連携させるにはどうすればよいですか?

+0

あなたの質問が正しく分かったら、 'int'を' char * 'に変更してください。他に何も変更する必要はありません。 –

+0

さて、 'free'を呼んでください。 – kaylum

+2

'&'を削除し、必要のない間接レベルを使用しないようにします。 –

答えて

0

global_struct.arraycharへのポインタである、そして文字列を指すように意図されたように見えます。私は、これは任意の配列のインデックスを保持することが保証unsigned整数型であるとして、size_tを入力するidxcounti、およびjを変更することをお勧め

void remove_strings(char *str[], size_t idx, size_t count); 

:だからあなたのような何かに関数のシグネチャを変更する必要があります。 size_tタイプはC99以降使用可能です。ここで

remove_int()機能の修正版を組み込んだデモプログラムです:

#include <stdio.h> 

struct { 
    char *array[100]; 
} global_struct; 

void remove_strings(char *str[], size_t idx, size_t count); 

int main(void) 
{ 
    global_struct.array[0] = "One"; 
    global_struct.array[1] = "Two"; 
    global_struct.array[2] = "Three"; 
    global_struct.array[3] = "Four"; 
    global_struct.array[4] = "Five"; 
    global_struct.array[5] = NULL; 

    for (size_t i = 0; global_struct.array[i]; i++) { 
     printf("%s\n", global_struct.array[i]); 
    } 

    remove_strings(global_struct.array, 2, 2); 

    putchar('\n'); 
    puts("After removal:"); 
    for (size_t i = 0; global_struct.array[i]; i++) { 
     printf("%s\n", global_struct.array[i]); 
    }  

    return 0; 
} 

void remove_strings(char *str[], size_t idx, size_t count) 
{ 
    size_t i, j; 

    for (i = 0; i < count; i++) 
     for (j = idx; str[j]; j++) 
      str[j] = str[j+1]; 
} 

プログラムの出力:

One 
Two 
Three 
Four 
Five 

After removal: 
One 
Two 
Five 

はまた、あなたの関数remove_int()だけintの配列に働くことが表示されます0のメンバーを除外すると、0が関数の内部ループのセンチネル値として使用されます。 charへのポインタの配列を終了させるのは普通のことですが、NULLポインタは、これまでのように、charの配列は'\0'で終わっています。しかし、一般的にはintの配列を0で終了させるのは良い考えではありません。あなたのコードのこの機能は、文字列を扱うためにそれを適用するのは簡単なことでした。

関数が現在の要件を満たしている場合は、配列に格納されているintの数を返すように関数を変更することを検討してください。配列に格納されたintの数を追跡し、この値を引数として渡すことは、関数がセンチネル値なしで配列を反復することを可能にします。

size_t remove_ints(size_t idx, size_t count, int arr[], size_t arr_sz) 
{ 
    size_t i, j; 

    for (i = 0; i < count; i++) 
     for (j = idx; j < arr_sz; j++) 
      arr[j] = arr[j+1]; 

    return arr_sz - count; 
} 
-2

"for(i = 0; i < count; i ++)"の目的は?私が理解したよう 私は、あなたがすべきだと思う:

void remove_int(int (*arr)[], int idx) 
{ 
    int j; 
    for (j = idx; (*arr)[j]; j++) 
     (*arr)[j] = (*arr)[j+1]; 
} 
+0

それは1つのインデックスを削除します。 –

+0

これは質問に答えません。 –

関連する問題