最初的问题得到了很严重的接受并得到了许多支持.所以我认为我会修改这个问题,以便更容易阅读,并希望能够为任何看到它的人提供更多帮助.最初的问题是为什么strlen()比手动循环字符串并找到'\ 0'字符要快20倍.我认为这个问题是有根据的,因为在任何地方我都会读到strlen()找到字符串长度的技术本质上是循环的,直到它找到一个空终止字符'\ 0'.这是对C字符串的常见批评,原因多于一个.正如许多人所指出的那样,作为C库一部分的函数是由智能程序员创建的,以最大限度地提高性能.
感谢ilen2,他将我与一个非常聪明的方法联系使用按位运算符一次检查8个字节,我设法得到一些东西,大于大约8到15个字符的字符串比strlen()运行得快,并且很多当字符串相当大时,比strlen()快许多倍.例如,奇怪的是,strlen()似乎是线性时间依赖于要完成的字符串的长度.另一方面,无论字符串长度(我测试了几百个),自定义的时间几乎相同.无论如何,我的结果是相当令人惊讶的,我做了他们优化关闭,我不知道他们是多么有效.非常感谢ilen2的链接和John Zwinck.有趣的是,John Zwinck建议SIMD可能为什么strlen()可能更快,但我对此一无所知.
我在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);}但它没有改变任何东西.我试图temp用char temp[1000]而不是malloc拿走free(temp);线来宣布,但它仍然做同样的事情.如果我拿走free(temp);线路仍然使用malloc问题解决了,但是存在巨大的内存泄漏,所以我不能这样做.如果有错误取决于myString字符串中的内容,这意味着如果那里有某个值,则总会出现错误,如果有另一个特定值,则永远不会出现错误,但我可以我们设法找出哪种类型的价值观有效,哪些价值观无效,似乎是随机的.
为什么free(temp);有时候工作,有时候不工作,怎样才能让它始终有效?
我做了一些研究strlen()并提出了一个问题.
假设我有一个50元素数组和一个指向第一个元素的指针,意思是:
char A[50],*x;
gets(A);
x=&A[0];
Run Code Online (Sandbox Code Playgroud)
从我的理解,strlen(x)我应该给我字符串的长度.
我的问题是,当我增加时会发生什么x?
我在运行于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手册没有在相应功能的页面上提到这些细节.
我写了这个函数来计算NULL终止的char指针的长度
size_t strlen(char* char_ptr) {
size_t len = 0;
while (*(char_ptr++) != '\0') {
++len;
}
return len;
}
并且它工作正常,但与strlen()相比它非常慢,有没有其他方法可以做到这一点?
注意: <string.h>不可用