Как найти длину без знака char * в C - PullRequest
6 голосов
/ 04 ноября 2008

У меня есть переменная

unsigned char* data = MyFunction();

как узнать длину данных?

Ответы [ 7 ]

9 голосов
/ 04 ноября 2008

Вы должны передать длину данных обратно от MyFunction. Кроме того, убедитесь, что вы знаете, кто выделяет память и кто должен ее освободить. Для этого есть разные модели. Довольно часто я видел:

int MyFunction(unsigned char* data, size_t* datalen)

Затем вы распределяете данные и передаете данные. В результате (int) должно быть указано, достаточно ли длинен ваш буфер (данные) ...

6 голосов
/ 04 ноября 2008

Предполагая, что это string

length = strlen( char* );

но, похоже, это не так ... поэтому нет способа без , когда функция возвращает длину.

3 голосов
/ 07 января 2010

Нет способа найти размер (unsigned char *), если он не завершен нулем.

2 голосов
/ 04 ноября 2008

Теперь это действительно не так сложно. Вы получили указатель на первый символ строки. Вы должны увеличивать этот указатель, пока не достигнете символа с нулевым значением. Затем вы вычитаете окончательный указатель из исходного указателя и вуаля, у вас есть длина строки.

int strlen(unsigned char *string_start)
{
   /* Initialize a unsigned char pointer here  */
   /* A loop that starts at string_start and
    * is increment by one until it's value is zero,
    *e.g. while(*s!=0) or just simply while(*s) */
   /* Return the difference of the incremented pointer and the original pointer */
}
1 голос
/ 05 ноября 2008

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

1 голос
/ 04 ноября 2008

Как уже говорилось, strlen работает только в строках с нулевым символом в конце, поэтому первый 0 (символ \ 0) будет отмечать конец строки. Вы лучше делаете что-то вроде этого:

unsigned int size;
unsigned char* data = MyFunction(&size);

или

unsigned char* data;
unsigned int size = MyFunction(data);
0 голосов
/ 04 ноября 2008
#include <stdio.h>
#include <limits.h>  
int lengthOfU(unsigned char * str)
{
    int i = 0;

    while(*(str++)){
        i++;
        if(i == INT_MAX)
            return -1;
    }

    return i;
}

НТН

...