Рассчитать длину строки в C

Я написал эту функцию для расчета длины NULL прекращенный указатель на символ

size_t strlen(char* char_ptr) {
    size_t len ​​= 0;
    while (*(char_ptr++)!= '\0') {
        ++ Len;
    }
    возврат лен;
}

И работает нормально, но очень медленно по сравнению с strlen(), есть ли другой способ сделать это?

Замечания: <string.h> не доступен

3 ответа

Размер char* просто sizeof(char*), Кажется, что после вы видите длину строки с нулевым символом в конце, которую вы получаете из strlen функция:

const char* blob = "Hello there";
size_t length = strlen(blob);

Давайте начнем с рассмотрения вашего кода, о котором вы говорите, что он работает нормально

size_t charSize = 0;
do {
    charSize++;
} while (*(++aValue) != '\0');

Давайте предположим, что есть определение

char *charPtr = "1";

В этом случае вы получите, что charSize будет равен 1, потому что внутри цикла charSize будет увеличиваться, а *(++aValue) будет равно '\0'.

Теперь давайте предположим, что у вас есть определение

char *charPtr = "";

это означает, что литерал не содержит символов. В этом случае ваш код имеет неопределенное поведение. Может вернуть любое значение. Действительно, сначала charSize увеличивается в цикле и становится равным 1 (хотя литерал пуст). Тогда условие *(++aValue)!= '\0' может быть равно true или false в зависимости от того, что следует за строковым литералом.

На самом деле вы хотите получить длину строки, на которую указывает указатель. Размер самого указателя можно получить просто как

sizeof( char * )

или же

sizeof charPtr

Чтобы получить длину строки, вы можете использовать стандартную функцию C std::strlen объявлено в заголовке <cstring> если вы используете C++ или функцию strlen(без квалификатора пространства имен), объявленный в заголовке <string.h> если вы используете C.

размер чего-либо всегда возвращается вызовом sizeof(), В вашем случае вы бы сделали sizeof(aValue) что даст размер этого указателя. В зависимости от того, на каком процессоре вы работаете, это даст значение, например: 4 на 32-битном процессоре, поскольку указатель имеет размер 32 бита и, следовательно, размер 4 байта.

Поскольку ваша реализация предполагает, что вы хотите знать, сколько символов вы сохранили, куда указывает ваш указатель, у вас действительно есть массив символов, за которым следует '\0' персонаж. В Си это часто упоминается как строка.

Если вы хотите узнать длину этой строки, функция strlen() в основном делает то, что делает ваша реализация и возвращает количество символов, не считая '\0' персонаж в конце.

В общем, вы сделали свою собственную маленькую реализацию strlen() прямо там.

С другой стороны: ваш код не совсем похож на обычный C, больше похож на Objective-C. Это будет означать, что у вас есть нативный класс, который имеет дело со строками NSString,

NSString *temp = @"/tmp/scratch";

Это больше не просто массив символов, оканчивающийся '\0' характер, но родной тип в этом языке.

Другие вопросы по тегам