如何高效地在C语言中计算字符串的长度?

25

如何在C中高效地计算字符串长度?

我目前使用的方法是:

int calculate_length(char *string) {
    int length = 0;
    while (string[length] != '\0') {
        length++;
    }
    return length;
}

然而与strlen()相比,它非常慢,有没有其他方法可以做到这一点?

谢谢。

编辑:我正在一个自由环境中工作,不允许使用包括"string.h"在内的任何外部库。


1
为什么不使用strlen呢?还是这只是一个练习? - Sam Post
2
这不是一项练习,我工作的环境不允许我包含其他“库”,包括“string.h”,因此我必须实现它,并希望在保持可维护性的同时尽可能高效。 - Carla Álvarez
您可能希望编辑原始帖子以提及您正在使用独立环境。 - Matthew Iselin
1
请注意,标准库也可以使用编译器优化进行编译,而您的代码则没有。 - Khelben
这里有很好的答案,但请记住这是微观优化,并且不是所有程序员都理解宏观优化的用途和重要性。这是一个看起来完全正常的代码40倍加速的例子:https://dev59.com/mnNA5IYBdhLWcg3whuV_#927773 - Mike Dunlavey
14个回答

0
在i386处理器上,libc通常使用一个超级优化的strlen版本,通常是用汇编语言编写的。论文“String Length”解释了它们的工作原理。
这里是一个针对OpenBSD进行优化的版本。(他们还有一个portable version。)这是GNU libc的版本

-1

我没有找到更好的:

inline size_t mystrlen(char *_)

  { return ((_ == NULL) ? (_[0] != '\0')) ? 0 : (1 + mystrlen(_ + 1)); }

使用递归会增加调用自身的开销(无法将递归到未知深度的函数“内联”)。 - Fox

-1

我不太确定你想要做什么。

你是想重新编写strlen,使你的代码与标准C库兼容,还是想管理字符串。

在第一种情况下,我认为你最好直接使用标准库。

另一种情况很有趣:你应该看一下C++的字符串类,它有一个实现了特性策略(允许快速操作非常大的字符串)。


这个问题非常明确,说明他不能使用标准的包含文件,因为他处于一个独立的环境中。 - Dispersia

-5
int max;
max = sizeof(str);
return (--max);

这仅适用于char数组和C字符串字面值。这对于指向字符串的指针不起作用。 - Eitan T
1
这将不能与字符串变量一起使用。 - Alex Shesterov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接