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++ = * strSrc++) != ‘\0‘ );//循环体结束后,strDest字符串的末尾正确地加上‘\0‘
return str; //为了实现链式操作,将目标地址返回
}

strncpy

#include <string.h>
char * strncpy (char * dest,const char * source,int count)
{
char *start = dest;
while (count && (*dest++ =*source++)) /* copy string */
count--;
if (count) /* pad out with zeroes */
while (--count)
*dest++ = ‘\0‘;
return(start);
}

strcmp

#include <string.h>
int strcmp(const char *str1,const char *str2)
{
/*不可用while(*str1++==*str2++)来比较,当不相等时仍会执行一次++,
return返回的比较值实际上是下一个字符。应将++放到循环体中进行。*/
while(*str1 == *str2)
{
if(*str1 == ‘\0‘)
return0;
str1++;
str2++;
}
return *str1 - *str2;
}

strncmp
//不区分大小写
int strncmp(const char * s1, const char * s2, size_t len)
{
while(len--) {
if(*s1 == 0 || *s1 != *s2)
return *s1 - *s2;
s1++;
s2++;
}
return 0;
}
//区分大小写
#include <ctype.h>
int strnicmp(const char * s1, const char * s2, size_t len)
{
register signed char r;
while(len--) {
if((r = toupper(*s1) - toupper(*s2)) || *s1 == 0)
return r;
s1++;
s2++;
}
return 0;
}

strlen

size_t strlen_a(const char *str) {
size_t length = 0;
while (*str++)
++length;
return length;
}
size_t strlen_b(const char *str) {
const char *cp = str;
while (*cp++);
return (cp - str - 1);
}

时间: 2024-10-18 06:38:36

strcpy、strncpy、strcmp、strncmp、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

库函数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) .因为两个

转:strcat与strcpy与strcmp与strlen

转自:http://blog.chinaunix.net/uid-24194439-id-90782.html strcat 原型:extern char *strcat(char *dest,char *src); 用法:#include <string.h> 功能:把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'. 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串. 返回指向dest的指针. 举例: // str

strcpy,strncpy,strcmp函数

void mystrcpy(char *dst,const char * src)//当dst的内存长度不够时将会产生溢出 { if (dst==NULL||src==NULL) { exit(0); } while(*src!='\0') *dst++=*src++; *dst='\0'; } int main() { char src[]="hello world"; char dst[]="zzzzzz"; strcpy(dst,src);//错误 发生越界

教教大家一些strcpy,strcmp,strcat,strlen函数的写法

VC源码: strcmp函数的写法: #include<stdio.h> #include<string.h> int strcmp1(char* a, char* b) { for(;*a==*b;a++,b++) if(*a!='\0') return 0; return *a - *b; } main() {  int l; char a[10]={"db"}; char b[10]={"cb"}; l=strcmp1(a,b); pr

GNU LIBC源码学习之strcmp

比较两个字符串 我的代码块 #include <string.h> int my_strcmp(const char* s1,const char * s2) { if((s1==NULL)||(s2==NULL)) return 0; while(1) { if((*s1=='\0')||(*s2=='\0')) break; if(*s1>*s2) return 1; if(*s1<*s2) return -1; s1++; s2++; } //if(*s1==*s2=='\0

[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

Android Zygote源码分析

目录 目录 概述 zygote分析 AppRuntime分析 创建虚拟机startVm 注册JNI函数startReg 进入JAVA世界 建立IPC通信服务端registerZygoteSocket 预加载类和资源preload 启动system_server 有求必应之等待请求runSelectLoop 概述 在Android系统中,所有的应用程序进程,以及用来运行系统关键服务的System进程都是由zygote进程负责创建的.因此,我们将它称为进程孵化器.zygote进程是通过复制自身的方式