2014-02-13 2 views
-5

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

 
size_t strlen(char* char_ptr) { 
    size_t len = 0; 
    while (*(char_ptr++) != '\0') { 
     ++len; 
    } 
    return len; 
} 

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

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

+7

Почему вы не используете функцию 'strlen'? – loentar

+2

Это не C или C++. Это Objective-C. – Synxis

+4

Objective-C - это расширение над C. Конечно, оно имеет «strlen». – loentar

ответ

11

Размер char* просто sizeof(char*). То, что вы, кажется, после того, как длина, оканчивающихся нулем строку, которую вы получаете от strlen function:

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

Пусть начинаются от рассмотрения код, о котором вы говорите, что она отлично работает

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.

1

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

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

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

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

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

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

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

Смежные вопросы