用C计算字符串的长度

时间:2014-02-13 15:15:45

标签: c pointers char sizeof strlen

我写了这个函数来计算NULL终止的char指针的长度

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

它工作正常,但与strlen()相比它非常慢,还有其他方法吗?

注意: <string.h>不可用

3 个答案:

答案 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'字符结尾,但是使用该语言的本机类型。