strlen源码解析

C语言实现strlen函数功能(附完整源码) 阅读详情

学习高效编程的有效途径之一就是阅读高手写的源代码,CRT(C/C++ Runtime Library)作为底层的函数库,实现必然高效。恰好手中就有glibc和VC的CRT源代码,于是挑了一个相对简单的函数strlen研究了一下,并对各种实现作了简单的效率测试。

strlen的函数原形如下:

      size_t strlen(const char *str);

strlen返回str中字符的个数,其中str为一个以'/0'结尾的字符串(a null-terminated string)。

1. 简单实现
如果不管效率,最简单的实现只需要4行代码:

1 size_t strlen_a(const char * str) {
2     size_t length = 0
;
3     while (*str++
)
4         ++
length;
5     return
 length;
6 }

也许可以稍加改进如下:

1 size_t strlen_b(const char * str) {
2     const char *cp =
 str;
3     while (*cp++
)
4 
        ;
5     return (cp - str - 1
);
6 }

2. 高效实现
很显然,标准库的实现肯定不会如此简单,上面的strlen_a以及strlen_b都是一次判断一个字符直到发现'/0'为止,这是非常低效的。比较高效的实现如下(在这里WORD表示计算机中的一个字,不是WORD类型):
(1) 一次判断一个字符直到内存对齐,如果在内存对齐之前就遇到'/0'则直接return,否则到(2);
(2) 一次读入并判断一个WORD,如果此WORD中没有为0的字节,则继续下一个WORD,否则到(3);
(3) 到这里则说明WORD中至少有一个字节为0,剩下的就是找出第一个为0的字节的位置然后return。


NOTE:
数据对齐(data alignment),是指数据所在的内存地址必须是该数据长度的整数倍,这样CPU的存取速度最快。比如在32位的计算机中,一个WORD为4 byte,则WORD数据的起始地址能被4整除的时候CPU的存取效率比较高。CPU的优化规则大概如下:对于n字节(n = 2,4,8...)的元素,它的首地址能被n整除才能获得最好的性能。

为了便于下面的讨论,这里假设所用的计算机为32位,即一个WORD为4个字节。下面给出在32位计算机上的C语言实现(假设unsigned long为4个字节):

 1 typedef unsigned long  ulong;
 2 

 3 size_t strlen_c(const char * str) {
 4 

 5     const char * char_ptr;
 6     const ulong *
longword_ptr;
 7 
    register ulong longword, magic_bits;
 8 

 9     for (char_ptr =  str; ((ulong)char_ptr 
10         & (sizeof(ulong) - 1)) != 0
;
11         ++
char_ptr) {
12         if (*char_ptr == '/0'
)
13             return char_ptr -
 str;
14 
    }
15 

16     longword_ptr = (ulong* )char_ptr;
17 

18     magic_bits = 0x7efefeffL ;
19 

20     while (1 ) {
21 

22         longword = *longword_ptr++ ;
23 

24         if ((((longword + magic_bits) ^ ~longword) & ~magic_bits) != 0 ) {
25 

26             const char *cp = (const char*)(longword_ptr - 1 );
27 
            
28             if (cp[0] == 0
)
29                 return cp -
 str;
30             if (cp[1] == 0
)
31                 return cp - str + 1
;
32             if (cp[2] == 0
)
33                 return cp - str + 2
;
34             if (cp[3] == 0
)
35                 return cp - str + 3
;
36 
        }
37 
    }
38 }

3. 源码剖析
上面给出的C语言实现虽然不算特别复杂,但也值得花点时间来弄清楚,先看9-14行:
for (char_ptr = str; ((ulong)char_ptr & (sizeof(ulong) - 1)) != 0; ++char_ptr) {
    
if (*char_ptr == '/0'
)
        
return char_ptr -
 str;
}

上面的代码实现了数据对齐,如果在对齐之前就遇到'/0'则可以直接return char_ptr - str;

第16行将longword_ptr指向数据对齐后的首地址

longword_ptr = (ulong*)char_ptr;

第18行给magic_bits赋值(在后面会解释这个值的意义)
magic_bits = 0x7efefeffL;

第22行读入一个WORD到longword并将longword_ptr指向下一个WORD
longword = *longword_ptr++;

第24行的if语句是整个算法的核心,该语句判断22行读入的WORD中是否有为0的字节
if ((((longword + magic_bits) ^ ~longword) & ~magic_bits) != 0)
if语句中的计算可以分为如下3步:
(1) longword + magic_bits
其中magic_bits的二进制表示如下:
                  b3      b2       b1       b0
              
31------------------------------->0

  magic_bits: 
01111110 11111110 11111110 11111111
magic_bits中的31,24,16,8这些bits都为0,我们把这几个bits称为holes,注意在每个byte的左边都有一个hole。

检测0字节:
如果longword 中有一个字节的所有bit都为0,则进行加法后,从这个字节的右边的字节传递来的进位都会落到这个字节的最低位所在的hole上,而从这个字节的最高位则永远不会产生向左边字节的hole的进位。则这个字节左边的hole在进行加法后不会改变,由此可以检测出0字节;相反,如果longword中所有字节都不为0,则每个字节中至少有1位为1,进行加法后所有的hole都会被改变。

为了便于理解,请看下面的例子:
                  b3      b2       b1       b0
              31------------------------------->0
  longword:   XXXXXXXX XXXXXXXX 
00000000 XXXXXXXX
+ magic_bits: 01111110 11111110 11111110 11111111
上面longword中的b1为0,X可能为0也可能为1。因为b1的所有bit都为0,而从b0传递过来的进位只可能是0或1,很显然b1永远也不会产生进位,所以加法后longword的第16 bit这个hole不会变。

(2)  ^ ~longword
这一步取出加法后longword中所有未改变的bit。

(3)  & ~magic_bits
最后取出longword中未改变的hole,如果有任何hole未改变则说明longword中有为0的字节。

根据上面的描述,如果longword中有为0的字节,则if中的表达式结果为非0,否则为0。
NOTE:
如果b3为10000000,则进行加法后第31 bit这个hole不会变,这说明我们无法检测出b3为10000000的所有WORD。值得庆幸的是用于strlen的字符串都是ASCII标准字符,其值在0-127之间,这意味着每一个字节的第一个bit都为0。因此上面的算法是安全的。

一旦检测出longword中有为0的字节,后面的代码只需要找到第一个为0的字节并返回相应的长度就OK:
const char *cp = (const char*)(longword_ptr - 1);

if (cp[0] == 0
)
    
return cp -
 str;
if (cp[1] == 0
)
    
return cp - str + 1
;
if (cp[2] == 0
)
    
return cp - str + 2
;
if (cp[3] == 0
)
    
return cp - str + 3;

4. 另一种实现
 1 size_t strlen_d(const char *str) {
 2 

 3     const char *char_ptr;
 4     const ulong *
longword_ptr;
 5 
    register ulong longword, himagic, lomagic;
 6 

 7     for (char_ptr = str; ((ulong)char_ptr 
 8         & (sizeof(ulong) - 1)) != 0
;
 9         ++
char_ptr) {
10         if (*char_ptr == '/0'
)
11             return char_ptr -
 str;
12 
    }
13 

14     longword_ptr = (ulong*)char_ptr;
15 

16     himagic = 0x80808080L;
17     lomagic = 0x01010101L
;
18 

19     while (1) {
20 

21         longword = *longword_ptr++;
22 

23         if (((longword - lomagic) & himagic) != 0) {
24 

25             const char *cp = (const char*)(longword_ptr - 1);
26 
            
27             if (cp[0] == 0
)
28                 return cp -
 str;
29             if (cp[1] == 0
)
30                 return cp - str + 1
;
31             if (cp[2] == 0
)
32                 return cp - str + 2
;
33             if (cp[3] == 0
)
34                 return cp - str + 3
;
35 
        }
36 
    }
37 }
上面的代码与strlen_c基本一样,不同的是:
magic_bits换成了himagic和lomagic
himagic = 0x80808080L;
lomagic 
= 0x01010101L;
以及 if语句变得比较简单了
if (((longword - lomagic) & himagic) != 0)

if语句中的计算可以分为如下2步:
(1) longword - lomagic
himagic和lomagic的二进制表示如下:
                b3      b2       b1       b0
            
31------------------------------->0

  himagic:  10000000 10000000 
10000000 10000000
  lomagic:  00000001 00000001 00000001 00000001

在这种方法中假设所有字符都是ASCII标准字符,其值在0-127之间,因此longword总是如下形式:
                b3      b2       b1       b0
            
31------------------------------->0

  longword: 
0XXXXXXX 0XXXXXXX 0XXXXXXX 0XXXXXXX

检测0字节:
如果longword 中有一个字节的所有bit都为0,则进行减法后,这个字节的最高位一定会从0变为1;相反,如果longword中所有字节都不为0,则每个字节中至少有1位为1,进行减法后这个字节的最高位依然为0。

 (2)  & himagic
这一步取出每个字节最高位的1,如果有任意字节最高位为1则说明longword中有为0的字节。

根据上面的描述,如果longword中有为0的字节,则if中的表达式结果为非0,否则为0。

5. 汇编实现
VC CRT的汇编实现与前面strlen_c算法类似

  1         page    ,132
  2         title   strlen - return the length of a null-terminated string
  3 ;***

  4 ;strlen.asm - contains strlen() routine
  5 
;
  6 
;       Copyright (c) Microsoft Corporation. All rights reserved.
  7 
;
  8 
;Purpose:
  9 ;       strlen returns the length of a null-
terminated string,
 10 ;       not including the null byte
 itself.
 11 
;
 12 ;*******************************************************************************

 13 
 14         .xlist
 15 
        include cruntime.inc
 16 
        .list
 17 

 18 page
 19 ;***

 20 ;strlen - return the length of a null-terminated string
 21 
;
 22 
;Purpose:
 23 
;       Finds the length in bytes of the given string, not including
 24 ;       the final null
 character.
 25 
;
 26 
;       Algorithm:
 27 ;       int strlen (const char *
 str)
 28 
;       {
 29 ;           int length = 0
;
 30 
;
 31 ;           while( *str++
 )
 32 ;                   ++
length;
 33 
;
 34 ;           return
( length );
 35 
;       }
 36 
;
 37 
;Entry:
 38 ;       const char * str -
 string whose length is to be computed
 39 
;
 40 
;Exit:
 41 ;       EAX = length of the string "str", exclusive of the final null byte

 42 ;
 43 
;Uses:
 44 
;       EAX, ECX, EDX
 45 
;
 46 
;Exceptions:
 47 
;
 48 ;*******************************************************************************

 49 
 50         CODESEG
 51 

 52         public  strlen
 53 

 54 strlen  proc /
 55         buf:ptr byte

 56 
 57         OPTION PROLOGUE:NONE, EPILOGUE:NONE
 58 

 59         .FPO    ( 0, 1, 0, 0, 0, 0 )
 60 

 61 string  equ     [esp + 4]
 62 

 63         mov     ecx,string              ; ecx -> string
 64         test    ecx,3                   ; test if string is aligned on 32
 bits
 65         je      short
 main_loop
 66 

 67 str_misaligned:
 68         ; simple byte
 loop until string is aligned
 69         mov     al,byte
 ptr [ecx]
 70         add     ecx,1

 71         test    al,al
 72         je      short
 byte_3
 73         test    ecx,3

 74         jne     short str_misaligned
 75 

 76         add     eax,dword ptr 0         ; 5 byte nop to align label below
 77 

 78         align   16                      ; should be redundant
 79 

 80 main_loop:
 81         mov     eax,dword ptr [ecx]     ; read 4
 bytes
 82 
        mov     edx,7efefeffh
 83 
        add     edx,eax
 84         xor     eax,-1

 85         xor     eax,edx
 86         add     ecx,4

 87         test    eax,81010100h
 88         je      short
 main_loop
 89         ; found zero byte
 in the loop
 90         mov     eax,[ecx - 4
]
 91         test    al,al                   ; is it byte 0

 92         je      short byte_0
 93         test    ah,ah                   ; is it byte 1

 94         je      short byte_1
 95         test    eax,00ff0000h           ; is it byte 2

 96         je      short byte_2
 97         test    eax,0ff000000h          ; is it byte 3

 98         je      short byte_3
 99         jmp     short main_loop         ; taken if bits 24-30
 are clear and bit
100                                         ; 31
 is set
101 

102 byte_3:
103         lea     eax,[ecx - 1
]
104 
        mov     ecx,string
105 
        sub     eax,ecx
106 
        ret
107 
byte_2:
108         lea     eax,[ecx - 2
]
109 
        mov     ecx,string
110 
        sub     eax,ecx
111 
        ret
112 
byte_1:
113         lea     eax,[ecx - 3
]
114 
        mov     ecx,string
115 
        sub     eax,ecx
116 
        ret
117 
byte_0:
118         lea     eax,[ecx - 4
]
119 
        mov     ecx,string
120 
        sub     eax,ecx
121 
        ret
122 

123 strlen  endp
124 

125         end

6. 测试结果
为了对上述各种实现的效率有一个大概的认识,我在VC8和GCC下分别进行了测试,测试时均采用默认优化方式。下面是在GCC下运行几百万次后的结果(在VC8下的运行结果与此相似):
strlen_a
--------------------------------------------------

       
1:        515 ticks         0.515 seconds
       
2:        375 ticks         0.375
 seconds
       
3:        375 ticks         0.375
 seconds
       
4:        375 ticks         0.375
 seconds
       
5:        375 ticks         0.375
 seconds
   total:       
2015 ticks         2.015
 seconds
 average:        
403 ticks         0.403
 seconds
--------------------------------------------------


strlen_b
--------------------------------------------------
       
1:        360 ticks          0.36 seconds
       
2:        390 ticks          0.39
 seconds
       
3:        375 ticks         0.375
 seconds
       
4:        360 ticks          0.36
 seconds
       
5:        375 ticks         0.375
 seconds
   total:       
1860 ticks          1.86
 seconds
 average:        
372 ticks         0.372
 seconds
--------------------------------------------------


strlen_c
--------------------------------------------------
       
1:        187 ticks         0.187 seconds
       
2:        172 ticks         0.172
 seconds
       
3:        187 ticks         0.187
 seconds
       
4:        187 ticks         0.187
 seconds
       
5:        188 ticks         0.188
 seconds
   total:        
921 ticks         0.921
 seconds
 average:        
184 ticks        0.1842
 seconds
--------------------------------------------------


strlen_d
--------------------------------------------------
       
1:        172 ticks         0.172 seconds
       
2:        187 ticks         0.187
 seconds
       
3:        172 ticks         0.172
 seconds
       
4:        187 ticks         0.187
 seconds
       
5:        188 ticks         0.188
 seconds
   total:        
906 ticks         0.906
 seconds
 average:        
181 ticks        0.1812
 seconds
--------------------------------------------------


strlen
--------------------------------------------------
       
1:        187 ticks         0.187 seconds
       
2:        172 ticks         0.172
 seconds
       
3:        188 ticks         0.188
 seconds
       
4:        172 ticks         0.172
 seconds
       
5:        187 ticks         0.187
 seconds
   total:        
906 ticks         0.906
 seconds
 average:        
181 ticks        0.1812
 seconds
--------------------------------------------------
 
C 语言中的 strlen 函数详解及示例代码 strlen 函数是 C 语言中的一个字符串处理函数,用于计算字符串的长度,即字符串中字符的个数(不包括字符串末尾的空字符 ‘\0’)。在 C 语言中,字符串是由字符数组表示的,以空字符 ‘\0’ 结尾。strlen 函数用于计算字符串的长度,通过遍历字符串并计数非空字符的个数来实现。strlen 函数的实现原理比较简单,它通过遍历整个字符串,直到遇到空字符 ‘\0’ 为止,计算遍历的字符个数。该函数接受一个指向字符数组(字符串)的指针作为参数,并返回一个无符号整数类型的值,表示字符串的长度。 阅读详情

相关推荐

gtsam 学习十(ISAM2 理论)

翻译自:iSAM2: Incremental Smoothing and Mapping Using the Bayes Tree 摘要 提出了一种新型的贝斯树处理稀疏矩阵,在转化为因子图,可以更好的求解平方根信息和映射问题。 文中提出了三个概念 使用概率密度项进行矩阵分解 介绍如何将矩阵分解转换为贝叶斯数和条件概率密度 基于贝叶斯树提供了一种新的系数非线性优化:ISAM2(进行重新排序和重新线性化,避免了批量更新) 问题描述 文章聚焦与如何用增量实时解决非线性问题, 利用增量即新的测量值实时更新估

weixin_37781153的博客 8407

【C语言】strlen()函数

strlen函数:计算的是字符串str的长度,从字符的首地址开始遍历,以 '\0' 为结束标志,然后将计算的长度返回,计算的长度并不包含'\0'。所以使用时,需规范初始化字符数组。本文也详细描述了实现strlen函数功能的三种方法。......

weixin_47970952的博客 12万+

大模型训练和推理

大模型训练moe是指混合专家(Mixture-of-experts,简称MoE)的,这是一种用于提高大型神经网络性能的技术,它可以将模型的一部分替换为多个专家,每个专家只负责处理一部分输入数据,从而增加模型的参数量和表达能力,同时减少计算量和训练时间。指令可以作为模型的输入的一部分,也可以作为模型的输出的一部分,具体取决于任务的类型。上下文扩展技术的,这是一种用于提高大型语言模型(LLM)对长文本的处理能力的技术,它可以让模型在不增加参数量的情况下,扩展其注意力范围,从而提高模型的语言理解和生成能力。

weixin_45325331的博客 6016

C标准库string.h源码一strlen

头文件<string.h>中定义了2组字符串函数。第一组函数的名字以str开头;第二组函数的名字以mem开头。除函数memmove外,其他函数都没有定义重叠对象间的复制行为。比较函数将参数作为unsigned char类型的数组看待。 glibc库函数没有对指针的合法性进行检查,用户在调用函数之前,需要先检查指针的合法性。用户应该写类似如下的代码: if(src == NULL |...

c1204611687的博客 2328

基于STM32的心电图监测系统设计

本论文旨在设计一种基于 STM32 微控制器的心电图监测系统,通过对人体心电信号的采集、处理和分析,实现对心电图的实时监测与显示。系统采用高精度的心电信号采集模块,结合 STM32 强大的数据处理能力,能够有效去除噪声干扰,提取出准确的心电信号特征。同时,利用 LCD 显示屏实现心电波形的实时显示,并通过蓝牙模块实现数据的无线传输,方便医护人员远程监测。经测试,该系统具有较高的精度和稳定性,能够满足临床心电图监测的基本需求,为医学诊断提供可靠的数据支持。

道亦无名 1348

利用GPAC生成MP4文件

GPAC主要针对学生和内容创作者,代表了一个跨平台的多媒体框架,开发人员可以使用它在 LGPL 许可下制作开源媒体。GPAC多媒体框架兼容范围广泛的流行文件类型,从常见格式(如 AVI、MPEG 和 MOV)到复杂格式(如 MPEG-4 系统或 VRML/X3D)和 360 电影。

深之JohnChen的专栏 1770

strlen函数实现源码与解析。

下面这段代码是我随便写的一个测试代码;其中对mystrlen定义其实就是一个strlen函数实现源码,大家自己仔细分析一下。 #include using namespace std; int main(int argc, char *argv[]) { int len=0; int mystrlen(const char *StrDest); char *str="h

chen 1万+

海康威视摄像头网线连接笔记本电脑,客户端提示:1连接设备失败。设备不在线或网络原因引起的连接超时等。(HCNetSDK.dll[7].)解决方案

1.环境 电脑:联想笔记本电脑(win10系统) 摄像头:海康威视DS-2CD3T20D-i5,4mm 连接方式:直接用网线将摄像头和摄像头连接 2.问题: 客户端出现如下提示: 3. 解决流程: 1.确认网线是否有问题:我的网线指示灯常亮,并且设备能够被搜索到,只是一直显示离线 2.按照网上教程直接配置摄像头的ip地址与电脑同一网段:登录失败。 错误码为 HCNetSDK.dll[7].(连接设备失败。设备不在【海康威视吧】_百度贴吧 失败了,没有反应 3.查看有线网卡的地

weixin_48911487的博客 3万+

strlen 源码解析

strlen源码剖析 学习高效编程的有效途径之一就是阅读高手写的源代码,CRT(C/C++ Runtime Library)作为底层的函数库,实现必然高效。恰好手中就有glibc和VC的CRT源代码,于是挑了一个相对简单的函数strlen研究了一下,并对各种实现作了简单的效率测试。 strlen的函数原形如下:       size_t strlen(const char *st

chenlong12580的专栏 5180

180.在 Vue3 中使用 OpenLayers 实现多个多边形的绘制、编辑、删除与清空

【摘要】本文介绍如何在Vue3+TypeScript环境下使用OpenLayers实现多边形地图交互功能。通过Composition API封装核心逻辑,实现了多边形绘制、编辑、删除及清空等操作。关键技术包括:使用VectorLayer管理图形数据,Draw/Modify/Select交互控制,以及通过ref()管理交互状态。文中提供了完整代码示例,并解决了交互对象叠加问题,为开发GIS应用提供了基础模块。该方案支持扩展为数据库存储、后端交互等高级功能。

小彭的博客 769

【HALCON 25.11 + C#】 01:2026年工业机器视觉实战详解(从入门到精通)

2026年机器视觉市场规模将突破230亿美元,HALCON 25.11的革命性更新与C#的工业集成优势形成黄金技术栈。本文作为付费专栏开篇序章,聚焦“为什么现在必须学25.11+C#”的核心问题,通过真实工业案例、五项核心技术突破、联合编程架构优势及30篇系统学习路线,全方位论证其投资价值。读者将掌握持续学习、深度OCR加速等关键技能,获得可直接上产线的工业级代码资产与架构设计思维,解决柔性生产、边缘部署等核心痛点,成为具备技术溢价的机器视觉工程师。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1216

【C语言】string.h中str函数源码实现解析(strlen、strcpy、strncpy、strcat、strcmp、strstr、memcpy、memmove)

strlen 函数原型:size_t strlen(const char *str); strlen返回str中字符的个数,其中str为一个以’\0’结尾的字符串(a null-terminated string)。 strlen源码简单实现 如果不管效率,最简单的实现只需要4行代码: size_t strlen_a(const char * str) { assert(str != NULL); //检查指针的有效性 size_t length = 0 ; while (*st

瞌睡的博客 4330

3D医学影像开发入门<一>:VS2019+DCMTK3.6.8编译及环境配置

3D医学影像开发入门:VS2019+DCMTK3.6.8编译及环境配置

欧特GO 1304

php的strlen函数的时间复杂度

<br />php的strlen函数时间复杂度是O(1)的,从下面php的源码中可以看出来。 zend_builtin_functions.cZEND_NAMED_FUNCTION(zend_if_strlen){        zval **str;        if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &str) == FAILURE) {                ZEND_WRONG_PARAM_COUNT();        

Rare's Tech-Blog 2843

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

string常用库函数之strlen

strlen函数是求字符串长度,或数组长度的函数提示:以下是本篇文章正文内容,下面案例可供参考。

2201_75723346的博客 486

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

[PHP源码阅读]strlen函数

文章来自:http://www.hoohack.me/2016/02/22/phps-source-analytics-strlen 我在github有对PHP源码更详细的注解。感兴趣的可以围观一下,给个star。PHP5.4源码注解。可以通过commit记录查看已添加的注解。 strlen函数说明。 int strlen ( string $string ) 在这篇文章...

weixin_30768661的博客 111

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

strlen php_简单谈谈PHP中strlen 函数

strlen函数说明。int strlen ( string $string )在这篇文章,我们可以知道strlen函数是通过Zend Engine定义的。函数的定义可以在这里查看。在这里也给出函数的源码:ZEND_FUNCTION(strlen){char *s1;int s1_len;if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s...

weixin_39997696的博客 205

风骚的strlen

前天逆向题目的时候,od不知道怎么抽了,竟然没有把strlen函数给标注出来。结果我害得我把strlen的代码给反编译了一遍。看完过后,脑洞大开。 这是汇编的源码:.text:00401390 ; =============== S U B R O U T I N E ======================================= .text:00401390 .text:0040

这里没人 684

GNU版strlen源码分析

直接操作C标准库提供的字符串操作函数是有一定风险的,稍有不慎就会导致内存问题。这周用业余时间写了一个小型的安全字符串操作库,但是测试之后才发现自己的实现有很大的性能缺陷。在Solaris上初步做了一个简单的性能比对,以下是得到的性能数据(以strlen的数据为例):当传入的字符串长度为10时,执行100w次:strlen 执行时间是:32762毫秒my_strlen执行时间是:491836...

weixin_30344995的博客 94

字符处理strlen()、strcmp()、strstr()源码及改编

int strcmp(const char* str1,const char *str2) strcmp函数用来比较字符串的,strcmp函数是根据ASCII码来比较两个字符串的。若两个字符串完全相等,则返回0;若第一个字符串大于第二个字符串,则返回大于0的数值;若第一个字符串小于第二个字符串,则返回小于0的数值。 传说中的源码:(看看原理即可) int __cdecl strcmp (const...

weixin_42271802的博客 503

C语言strcpy、strcat、strlen、strcmp源码汇总

四个常用函数的源码`strcpy()``strcat()``strlen()``strcmp()` strcpy() 字符串复制 char *strcpy(char *dest, const char *src) { char *cp = dest; while( *cp++ = *src++ ); /* Copy src over dest */ return( dest ); } strcat() 字符串拼接 char* strcat

Bronc的博客 610

仰视源码,实现strlen

最近对于C++源码特别感兴趣,读源码,然后根据源码实现一遍,对我帮助蛮大的。下面给出我们天天用的strlen的实现:普通实现size_t strlen1(const char* str){ const char* tmp = str; size_t rtn = 0; while(tmp++ != '\0') rtn++; return rtn; }源码实现size_t

奔跑的小河 669

count效率PHP,PHP函数count、strlen效率分析

一直纠结PHP中统计数组长度函数count(),还有strlen是怎么的,它的效率是O(1)还是O(n)呢?最近看PHP源码,总结了下。分析如下:zend给php的所有变量都用共用体的方式去保存,而字符串的保存和数组的保存也是不同的,数组采用的是hash表的方式去保存。PHP的变量共用体描述如下/** zval*/typedef struct _zval_struct zval;typedef u...

weixin_28920737的博客 205

strcpy, strcat, strcmp, strlen,memcpy

微软的几个源码: /*** *char *strcpy(dst, src) - copy one string over another * *Purpose: * Copies the string src into the spot specified by * dest; assumes enough room. * *Entry: * char * dst - string over

ZkvIA的博客 956
上一篇: 几个位运算
InterFloat
博客等级 码龄19年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值