2013-06-21 3 views
-1

У меня есть массив указатель символьныйДлина массива символов - C

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 **’ 

Я не могу понять, в чем проблема.

+2

C никогда не отслеживает длину массивов. strlen просто выполняет итерацию по символам до тех пор, пока не найдет нулевой символ ('\ 0'), который добавляет к концу каждого из ваших строковых литералов.Поэтому, если вы передадите strlen char **, который в вашем случае указывает на группу из 3 указателей, если он сработает, он вернет значение тарабарщины. Эта ошибка - это компилятор, который избавляет вас от чего-то, чего вы почти наверняка не хотели. – Sqeaky

+0

Чтобы предотвратить возможные будущие проблемы, вы можете захотеть определить 'array' как указывающие на немодифицируемые строки (которые имеют константные константы):' const char * array [] ' – pmg

+1

Вы должны понимать, что C на самом деле не поддерживает «массивы * или * струны, это просто любопытно подпирает их на пару углов. Вы должны действовать очень осторожно, когда имеете дело с этим, пока не получите «почувствовать» все это. (И даже тогда есть подводные камни, которые могут уловить опытных программистов C.) –

ответ

1

Вы пытаетесь использовать строковую функцию в массиве указателей.

read В (кстати, не используйте LibC имена функций) events имеет тип const char ** a.k.a указатель на массив или char * указателей на символ.

Используя strlen, вы получите непредсказуемые результаты. Если вам повезет, это приведет к сбою вашей программы с нарушением сегментации.

В массивах C нет инерциального размера или длины. Вы должны передать это как отдельный аргумент своей функции.

Причина strlen работы по char * (символьные массивы), потому что по соглашению строки в C заканчиваются специальным символом нуль-терминатора '\0'. он подсчитывает количество символов до первого «\ n». Это не относится к регулярным массивам.

Если вы хотите длины соответствующих строк, то вы можете получить их с strlen(events[0]), strlen(events[1]), strlen(events[2])

+0

Я хочу длину массива указателей, а не связанные длины строк. Я попробовал следующие строки (события). Он дает правильный результат, но он выдает ошибку. У этой проблемы все еще есть та же проблема. – pistal

+0

@ user2015933 Невозможно получить произвольную длину массива в C, если она неизвестна. Вы должны передать это как отдельный аргумент. Извините, но это то, что делает C сложным, но мощным. –

1

Youre пытается вычислить strlen на нестроке - массив строк на самом деле. strlen принимает в качестве аргумента char *, а вы передаете char ** (указатель на массив массивов символов). Посмотрите, что произойдет с strlen(events[0]) - должно вернуть 3, длину "foo".

0

StrLen дают длину char* но вы передаете 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 в конце, а затем рассчитывать

0

Вам необходимо пройти в одной строке, а не строка строк. Перейдите в одну строку, используя индекс одной строки вместо **.