Нахождение длины массива символов - PullRequest
24 голосов
/ 27 мая 2011

У меня есть следующий код:

int i=0;
char a[7]={0x00,0xdc,0x01,0x04};
int len=0;
len = sizeof(a);
printf("The Length is : %d", len);

Здесь я хочу найти длину массива a в с? Как это можно сделать?

Ответы [ 5 ]

31 голосов
/ 27 мая 2011

По соглашению строки C имеют нулевое окончание. Это означает, что в конце есть дополнительный байт со значением ноль (0x00). Любая функция, которая делает что-то со строкой (например, printf), будет считать, что строка заканчивается, когда она находит ноль. Это также означает, что если ваша строка не заканчивается нулем, она будет продолжать работать до тех пор, пока не найдет нулевой символ, что может привести к интересным результатам!

Поскольку первый элемент в вашем массиве - 0x00, он будет считаться нулевой длиной (без символов).

Если вы определили свою строку как:

char a[7]={0xdc,0x01,0x04,0x00};

например. нулевой байт

затем вы можете использовать strlen для измерения длины строки, хранящейся в массиве.

sizeof измеряет размер шрифта. Это не то, что вы хотите. Также помните, что строка в массиве может быть короче размера массива.

3 голосов
/ 27 мая 2011

sizeof возвращает размер типа переменной в байтах. Так что в вашем случае он возвращает размер вашего char[7], который равен 7 * sizeof(char). Поскольку sizeof(char) = 1, результат равен 7.

Расширяем это до другого примера:

int intArr[5];
printf("sizeof(intArr)=%u", sizeof(intArr));

даст 5 * sizeof(int), поэтому вы получите результат «20» (по крайней мере, на обычной 32-битной платформе. На других sizeof(int) может отличаться)

Чтобы вернуться к вашей проблеме:

Похоже, что вы хотите знать, это длина строки, которая содержится внутри вашего массива, а не общий размер массива.

По определению C-строки должны заканчиваться завершающим символом '\ 0' (0-байт). Таким образом, чтобы получить соответствующую длину строки, содержащейся в вашем массиве, у вас есть сначала завершить строку, чтобы вы могли сказать, когда она закончилась. Иначе теперь был бы способ узнать.

Все стандартные функции основаны на этом определении, поэтому, если вы вызываете strlen, чтобы получить str ing len gth, он будет перебирать указанный массив, пока не найдет первый 0-байт, который в вашем случае будет самым первым элементом.

Еще одна вещь, которая может вам понадобиться знать, что только потому, что вы не заполняете оставшиеся элементы вашего char[7] значением, они действительно содержат случайные неопределенные значения.

Надеюсь, это помогло.

3 голосов
/ 27 мая 2011

Если вы ожидаете 4 в качестве вывода, попробуйте следующее:

char a [] = {0x00,0xdc, 0x01,0x04};

1 голос
/ 12 мая 2013

Вы можете попробовать это:

   char tab[7]={'a','b','t','u','a','y','t'};
   printf("%d\n",sizeof(tab)/sizeof(tab[0]));
0 голосов
/ 27 мая 2011

Вы можете сделать len = sizeof(a)/sizeof(*a) для любого вида массива. Но вы инициализировали его как a[7] = {...}, то есть его длина равна 7 ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...