Рассчитать длину строки в 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'
характер, но родной тип в этом языке.