标签: strlen

为什么strlen()比手动循环检查空终止字符快20倍?

最初的问题得到了很严重的接受并得到了许多支持.所以我认为我会修改这个问题,以便更容易阅读,并希望能够为任何看到它的人提供更多帮助.最初的问题是为什么strlen()比手动循环字符串并找到'\ 0'字符要快20倍.我认为这个问题是有根据的,因为在任何地方我都会读到strlen()找到字符串长度的技术本质上是循环的,直到它找到一个空终止字符'\ 0'.这是对C字符串的常见批评,原因多于一个.正如许多人所指出的那样,作为C库一部分的函数是由智能程序员创建的,以最大限度地提高性能.

感谢ilen2,他将我与一个非常聪明的方法联系使用按位运算符一次检查8个字节,我设法得到一些东西,大于大约8到15个字符的字符串比strlen()运行得快,并且很多当字符串相当大时,比strlen()快许多倍.例如,奇怪的是,strlen()似乎是线性时间依赖于要完成的字符串的长度.另一方面,无论字符串长度(我测试了几百个),自定义的时间几乎相同.无论如何,我的结果是相当令人惊讶的,我做了他们优化关闭,我不知道他们是多么有效.非常感谢ilen2的链接和John Zwinck.有趣的是,John Zwinck建议SIMD可能为什么strlen()可能更快,但我对此一无所知.

c c++ c-strings string-length strlen

-3
推荐指数
1
解决办法
294
查看次数

C语言中free()函数的问题

我在while循环中有一个for循环来处理字符串.这基本上是我的代码的结构:

char myString[1000];
//Initialize and maybe change myString
for(/*conditions*/){
    while(/*conditions*/){
        if(strchr(myString,' ') == NULL){
            break;
        }
        char *temp = malloc(sizeof(char) * strlen(myString));
        strcpy(temp,myString);
        *strchr(temp,' ') = '\0';
        strcat(myString," ");
        strcat(myString,temp);
        free(temp);
    }
}
Run Code Online (Sandbox Code Playgroud)

有时,这段代码运行得很好,但有时候进程结束并返回3,这意味着有一个错误(3是我尝试使用NULL时通常会得到的返回值,我不应该喜欢,例如myPointer->examplewhere myPointerNULL ).经过一些测试,我发现引起问题的那条线是free(temp);.我试图替换它,if(temp != NULL){free(temp);}但它没有改变任何东西.我试图tempchar temp[1000]而不是malloc拿走free(temp);线来宣布,但它仍然做同样的事情.如果我拿走free(temp);线路仍然使用malloc问题解决了,但是存在巨大的内存泄漏,所以我不能这样做.如果有错误取决于myString字符串中的内容,这意味着如果那里有某个值,则总会出现错误,如果有另一个特定值,则永远不会出现错误,但我可以我们设法找出哪种类型的价值观有效,哪些价值观无效,似乎是随机的.

为什么free(temp);有时候工作,有时候不工作,怎样才能让它始终有效?

c malloc pointers strlen

-3
推荐指数
1
解决办法
213
查看次数

在递增指针后使用strlen()会发生什么?

我做了一些研究strlen()并提出了一个问题.

假设我有一个50元素数组和一个指向第一个元素的指针,意思是:

char A[50],*x;
gets(A);
x=&A[0];
Run Code Online (Sandbox Code Playgroud)

从我的理解,strlen(x)我应该给我字符串的长度.

我的问题是,当我增加时会发生什么x

c arrays pointers gets strlen

-3
推荐指数
1
解决办法
267
查看次数

为什么我在PHP中使用strlen()函数为同一个字符串获取两个不同的输出?

我在运行于Windows 10 Home Single Language 64位操作系统的机器上使用PHP 7.2.11.

我试过以下代码:

第1号代码片段

<?php
$str = 'abc\0def';
echo strlen($str); // Outputs 8
?>
Run Code Online (Sandbox Code Playgroud)

代码片段2

<?php
$str = "abc\0def";
echo strlen($str); // Outputs 7
?>
Run Code Online (Sandbox Code Playgroud)

我不明白为什么同一个函数为同一个字符串产生两个不同的输出?有一次它提供输出8和另一次7

为什么这样?

功能strlen()是二进制安全还是多字节安全?PHP手册没有在相应功能的页面上提到这些细节.

php strlen

-3
推荐指数
1
解决办法
33
查看次数

用C计算字符串的长度

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

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

并且它工作正常,但与strlen()相比它非常慢,有没有其他方法可以做到这一点?

注意: <string.h>不可用

c pointers sizeof char strlen

-5
推荐指数
1
解决办法
2221
查看次数

标签 统计

strlen ×5

c ×4

pointers ×3

arrays ×1

c++ ×1

c-strings ×1

char ×1

gets ×1

malloc ×1

php ×1

sizeof ×1

string-length ×1