我写了这个函数来计算NULL
终止的char指针的长度
size_t strlen(char* char_ptr) { size_t len = 0; while (*(char_ptr++) != '\0') { ++len; } return len; }
它工作正常,但与strlen()相比它非常慢,还有其他方法吗?
注意: <string.h>
不可用
答案 0 :(得分:11)
char*
的大小仅为sizeof(char*)
。你看起来是什么是一个空终止字符串的长度,你从strlen
function获得:
const char* blob = "Hello there";
size_t length = strlen(blob);
答案 1 :(得分: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
要获取字符串的长度,您可以使用标头std::strlen
中声明的标准C函数<cstring>
,如果您使用的是标头{C}或函数strlen
(没有名称空间限定符){ {1}}如果您使用的是C。
答案 2 :(得分:1)
通过调用sizeof()
始终返回任何内容的大小。在你的情况下,你会做sizeof(aValue)
,这将产生该指针的大小。
根据您正在使用的CPU,这将产生例如1的值。 32位处理器上4
,因为指针是32位,因此大小中有4个字节。
由于您的实现建议您想要知道指针所指向的存储了多少个字符,所以您真正拥有的是一个字符数组,后跟'\0'
字符。
在C中,通常称为字符串。
如果您想知道该字符串的长度,函数strlen()
基本上会执行您的实现所做的操作并返回字符数而不计算'\0'
字符结束。
基本上,你在那里做了strlen()
的小实现。
侧面说明:您的代码看起来不像普通的C,更像是Objective-C。这意味着你有一个本地类来处理名为NSString
的字符串。
NSString *temp = @"/tmp/scratch";
这不再只是一个字符数组,以'\0'
字符结尾,但是使用该语言的本机类型。