库函数strlen源码重现及注意问题

首先直接上源码:

size_t strlen (const char * str)
{
	const char *eos = str;
	while(*eos++);
	return(eos - str - 1);
}

可以看到strlen是利用一个新的char*指针,一直向后遍历,找到字符串结尾的\0,的下一个元素。然后计算距离。

但是这里注意一点 size_t 其实是 unsigned int 类型的。所以比较两个字符串长度大小的时候不能使用 strlen(a) - strlen(b) 。因为两个无符号的整型相减是得不到一个负数的,所以不管怎么样得到的结果都是一个整数。也就是strlen(a)永远大于strlen(b)。

可以使用 strlen(a) > strlen(b) 这个表达式判断两个字符串的大小,不能使用 strlen(a) - strlen(b) > 0

时间: 2024-12-12 21:22:13

库函数strlen源码重现及注意问题的相关文章

strlen源码剖析(可查看glibc和VC的CRT源代码)

学习高效编程的有效途径之一就是阅读高手写的源代码,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. 简单实现

【转】strlen源码

strlen源码剖析 学习高效编程的有效途径之一就是阅读高手写的源代码,CRT(C/C++ Runtime Library)作为底层的函数库,实现必然高效.恰好手中就有glibc和VC的CRT源代码,于是挑了一个相对简单的函数strlen研究了一下,并对各种实现作了简单的效率测试. strlen的函数原形如下: size_t strlen(const char *str); strlen返回str中字符的个数,其中str为一个以'\0'结尾的字符串(a null-terminated strin

strcpy、strncpy、strcmp、strncmp、strlen源码

strcpy#include <string.h>#include <assert.h>char * strcpy( char *strDest, const char *strSrc ) //将源字符串加const,表明其为输入参数{ assert( (strDest != NULL) &&(strSrc != NULL) ); //对源地址和目的地址加非0断言,检查指针的有效性 char *str = strDest; while( (*strDest++ =

[PHP源码阅读笔记]strlen函数

文章来自:http://www.aintnot.com/2016/02/22/phps-source-analytics-strlen strlen函数说明. int strlen ( string $string ) 在这篇文章,我们可以知道strlen函数是通过Zend Engine定义的.函数的定义可以在这里查看. 在这里也给出函数的源码: ZEND_FUNCTION(strlen) { char *s1; int s1_len; if (zend_parse_parameters(ZEN

源码分析:动态分析 Linux 内核函数调用关系

源码分析:动态分析 Linux 内核函数调用关系 时间 2015-04-22 23:56:07  泰晓科技 原文  http://www.tinylab.org/source-code-analysis-dynamic-analysis-of-linux-kernel-function-calls/ 主题 Linux源码分析 By Falcon ofTinyLab.org 2015/04/18 缘由 源码分析是程序员离不开的话题. 无论是研究开源项目,还是平时做各类移植.开发,都避免不了对源码的

Redis源码学习:字符串

Redis源码学习:字符串 1.初识SDS 1.1 SDS定义 Redis定义了一个叫做sdshdr(SDS or simple dynamic string)的数据结构.SDS不仅用于 保存字符串,还用来当做缓冲区,例如AOF缓冲区或输入缓冲区等.如下所示,整数len和free分别表示buf数组中已使用的长度和剩余可用的长度,buf是一个原生C字符串,以\0结尾. sds就是sdshdr中char buf[]的别名,后面能看到,各种操作函数的入参和返回值都是sds而非sdshdr.那sdshd

FFmpeg源码简单分析:结构体成员管理系统-AVOption

===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFmpeg源码结构图 - 编码 [通用] FFmpeg 源码简单分析:av_register_all() FFmpeg 源码简单分析:avcodec_register_all() FFmpeg 源码简单分析:内存的分配和释放(av_malloc().av_free()等) FFmpeg 源码简单分析:常

【源码剖析】Webbench —— 简洁而优美的压力测试工具

Webbench 是一个古老而著名的网站压力测试工具,简单而实用.如果你不清楚你的网站能承受多大的压力,或者你想分析对比两个网站的性能,webbench 再好用不过了. Gitbub 地址:https://github.com/cnnewjohn/webbench 安装: 很简单,cd 进项目主页后进行 make install clean 就好了. 用法: 想要知道用法可以在安装后直接输入 webbench 或 webbench -h 或 webbench --help. 可以看到: webb

Redis内存管理的基石zmallc.c源码解读(二)

上一篇博文中,我介绍了zmalloc.c文件中几个常用的函数,接下来给大家介绍一下该文件中的其他函数,其实本文中的很多函数要比上一篇文章中的函数要更有趣的,并且涉及到很多操作系统的知识.前面几个函数比较简单,一笔带过,后面几个是学习的重点. 开胃菜 zmalloc_enable_thread_safeness void zmalloc_enable_thread_safeness(void) { zmalloc_thread_safe = 1; } zmalloc_thread_safe是一个全