7

char次の関数を実装して、ポインタ配列を介して参照されるいくつかの文字列の内容を出力したいと思います。関数の引数として合計を渡さずに、ポインターがいくつあるかをどのように判断できますか?

型の配列であれば、関数intを使用することは可能sizeof()ですが、配列の各項目がchar文字列へのポインターであり、各文字列の長さが異なる可能性があることを考えると、このアプローチを使用できるとは思いません。

void printCharArray(char *arr[]){

    int length = sizeof(arr) / sizeof(char); /* this does not give correct 
                                          number of items in the pointer array */

    for (int i=1;i<=length; i++) {
        printf("Array item: [%s]",arr[i]);
    }

}
4

5 に答える 5

13

Cはこのように配列内の要素の数を追跡しないため、これを行う組み込みの方法はありません。

いくつかのオプションがあります。

  1. 配列内のアイテムの数を渡します。
  2. 最後の項目をNULLに設定して、コードが最後に到達したことを認識できるようにします。(これは、C文字列の処理方法の一種です。)
  3. それ以外の場合は、データ構造を変更して、配列内のアイテムの数を追跡します。
于 2012-12-24T00:56:08.213 に答える
6

Cでは、配列を関数の引数として渡すことはできません。配列の名前は、関数の引数として使用すると最初の要素へのポインタに減衰します。使用可能な配列要素の数を個別に指定する必要があります。

(関数パラメータータイプのコンテキストでは、とT[]は同一であるため、関数パラメーターも同じである可能性があります。)T*T[12]char ** arr

そのようです:

void printCharArray(char ** arr, size_t len) { /* ... */ }

int main()
{
    char * arr[10] = { "Hello", "World", /* ... */ };

    printCharArray(arr, sizeof(arr)/sizeof(*arr));
}

(または、「最初の」ポインターと「最後の1つ」ポインターを指定することもできます。これは、もう少し自然な場合があります。)

于 2012-12-24T00:56:43.893 に答える
2

最後の有効な要素の後の要素をnullに設定すると、次のことができます。

void printCharArray(char *arr[]){

    for (int i=0; arr[i] != NULL; i++) {
        printf("Array item: [%s]",arr[i]);
    }

}
于 2012-12-24T00:55:37.683 に答える
0
void printCharArray(char *arr[]) {
    int length = sizeof(arr) / sizeof(char*); /* this does not give correct 
                                                 number of items in the pointer array */
    for (int i=0;i<=length; i++) {
        printf("Array item: [%s]",arr[i]);
    }
}

int main()
{
    char * arr[10] = { "Hello", "World", /* ... */ };
    printCharArray(arr); 
}
于 2012-12-24T04:25:18.637 に答える
0

最初に、yをグローバル変数として宣言しました。htmTagsは*char[]です。次にmain()で

y = 0;
while( htmTags[y] ) {
        y++;
}

配列の最後にnullを追加しませんでした。配列要素の実際の数を提供します

または、これは(y = 0; htmTags [y]; y ++);でも機能します。

于 2015-10-15T02:53:18.170 に答える