-1

私はポインタ文字配列を持っています

void main(){
    char* array[] = 
            {
                    [0] = "foo",
                    [1] = "bar",
                    [2] = "baz"
            };
read(array);
}

を使用して長さを取得しようとするときstrlen

int read(const char* events[]){
int size_of_events;
        size_of_events = (strlen(events));
}

次の警告がスローされます。

warning: passing argument 1 of ‘strlen’ from incompatible pointer type [enabled by default]
In file included from test.c:6:0:
/usr/include/string.h:395:15: note: expected ‘const char *’ but argument is of type ‘char **’

何が問題なのか理解できません..

4

4 に答える 4

1

ポインター配列で文字列関数を使用しようとしています。

In read(ちなみに libc 関数名は使用しないでください)eventsは、const char **別名配列へのポインターまたはchar *char へのポインターの型です。

on を使用strlenすると、予測できない結果が生じます。運が良ければ、セグメンテーション違反でプログラムがクラッシュします。

C 配列では、慣性的にサイズや長さはありません。それを別の引数として関数に渡す必要があります。

strlenが (文字配列) で機能する理由char *は、慣例により、C の文字列は特別なヌル終了記号で終了するため'\0'です。最初の「\n」までの文字数をカウントします。これは、通常の配列には当てはまりません。

関連する文字列の長さが必要な場合は、次のようにして取得できますstrlen(events[0]), strlen(events[1]), strlen(events[2])

于 2013-06-21T14:37:06.463 に答える
1

strlen非文字列で計算しようとしています-実際には文字列の配列です。a (文字の配列の配列へのポインタ) を渡している間、引数としてstrlenaを取ります。- で何が起こるか見てみましょう。char *char **strlen(events[0])"foo"

于 2013-06-21T14:35:04.760 に答える
0

文字列の文字列ではなく、1 つの文字列を渡す必要があります。** の代わりに 1 つの文字列のインデックスを使用して、1 つの文字列を渡します。

于 2013-06-21T14:36:40.933 に答える
0

strlen は a の長さを指定しますが、achar*を渡していますchar**

配列の長さが必要だと思いますが、最後に NULL がないため、それを取得できません

あなたの配列が次のような場合:

char* array[] = 
        {
                [0] = "foo",
                [1] = "bar",
                [2] = "baz",
                [3] = NULL,   /* in stdlib.h */
        };

次に、次のようなものに行くことができます

int read(const char* events[]){
        int size_of_events = 0;
        while (events[size_of_events] != NULL)
            size_of_events++;
        return (size_of_events);
}

イベント配列のサイズが不明で、それをカウントしたい場合はNULL、最後に追加してカウントするだけです

于 2013-06-21T14:35:19.293 に答える