<string.h>里的字符串操作函数是经常要用到的,因此阅读了源码后自己实现了一些:

拷贝函数

void * Mymemcpy(void * sDst, const void * sSrc, size_t count)
{
assert(NULL != sDst && NULL != sSrc);
char* saveDst = (char *)sDst;
const char* saveSrc = (char *)sSrc; for (; 0 < count; ++saveDst, ++saveSrc, --count)
*saveDst = *saveSrc; return (void*)sDst;
} void * Mymemmove(void* sDst, const void* sSrc, size_t count)
{
assert(NULL != sDst && NULL != sSrc);
char* saveDst = (char *)sDst;
const char* saveSrc = (char *)sSrc; if ((saveDst > saveSrc) && (saveDst < saveSrc + count)) for (saveDst += count, saveSrc += count; 0 < count; --count) // copy backwards
*--saveDst = *--saveSrc;
else for (; 0 < count; ++saveDst, ++saveSrc, --count) // copy forwards
*saveDst = *saveSrc; return (void *)sDst;
} char * Mystrcpy(char* sDst, const char* sSrc)
{
assert(NULL != sDst);
char* saveDst = sDst;
for (; '\0' != (*saveDst++ = *sSrc++);)
;
return (char *)sDst;
} char * Mystrncpy(char* sDst, const char* sSrc, size_t count)
{
assert(NULL != sDst && NULL != sSrc);
char* saveDst = sDst; for (; (0 < count) && ('\0' != *sSrc); --count)
*saveDst = *sSrc; for (; 0 < count; --count)
*saveDst++ = '\0'; return (char *)sDst; } void * Mymemset(void* sDst, int ch, size_t count)
{
unsigned char* saveDst = (unsigned char *)sDst;
unsigned char c = ch; for (; (0 < count) && ('\0' != *saveDst); ++saveDst, --count)
*saveDst = c; return (void *)sDst;
}

查找函数

void * Mymemchr(const void* str, const int ch, size_t n)
{
assert(NULL != str);
const unsigned char c = ch;
const unsigned char * ssave = (unsigned char *)str; for (; ('\0' != *ssave) && (0 < n); --n, ++ssave)
if (c == *ssave)
return (void*)ssave; return NULL;
} char * Mystrchr(const char* str, int ch)
{
assert(NULL != str);
const unsigned char c = ch; for (; '\0' != *str; ++str)
if ('\0' == *str)
return NULL; return (char*)str;
} char * Mystrrchr(const char* str, int ch)
{
assert(NULL != str);
const unsigned char c = ch;
const char * ssave = NULL; for (; '\0' != *str; ++ str)
if (c == *str)
ssave = str; return (char *)ssave;
} char * Mystrstr(const char* str1, const char * str2)
{
assert(NULL != str1 && NULL != str2);
if ('\0' == *str2)
return (char*)str1; for (; NULL != (str1 = Mystrchr(str1, *str2)); ++str1)
{
const char * ssave1 = str1;
const char * ssave2 = str2; for (;;)
{
if ('\0' == *++ssave2)
return (char*)str1;
else
if (*++ssave1 != *ssave2)
break;
} } return NULL;
}

连接函数

char * Mystrcat(char * sDst, const char * sSrc)
{
assert(NULL != sDst && NULL != sSrc);
char * ssave = sDst; for (; '\0' != *ssave; ++ssave)
; for (; '\0' != (*ssave = *sSrc); ++ssave, ++sSrc)
; return (char*)sDst;
} char * Mystrncat(char * sDst, const char * sSrc, size_t count)
{
assert(NULL != sDst && NULL != sSrc);
char* ssave = sDst; for (; '\0' != *ssave; ++ssave)
; for (; ('\0' != *sSrc) && (0 < count); --count)
*ssave++ = *sSrc++; *ssave = '\0'; return (char*)sDst;
}

比较函数

int Mymemcmp(const void* str1, const void * str2, size_t n)
{
assert(NULL != str1 && NULL != str2);
const unsigned char * ssave1 = (unsigned char *)str1;
const unsigned char * ssave2 = (unsigned char *)str2; for (; 0 < n; ++ssave1, ++ssave2, --n)
{
if (*ssave1 != *ssave2)
return ((*ssave1 < *ssave2) ? -1 : 1);
else if ('\0' == *ssave1)
return (0); }
return 0;
} int Mystrcmp(const char* str1, const char * str2)
{
assert(NULL != str1 && NULL != str2);
for (; *str1 == *str2; ++str1, ++str2)
if('\0' == *str1 )
return 0; return ((*str1 < *str2) ? -1 : 1);
} int Mystrncmp(const char* str1, const char * str2, size_t n)
{
assert(NULL != str1 && NULL != str2);
for (; 0 < n; ++str1, ++str2, --n)
if (*str1 != *str2)
return ((*str1 < *str2)? -1 : 1);
else if ('\0' == *str1)
return 0; return 0;
} int memcmp(const void* sSrc1, const void* sSrc2, size_t num)
{
assert (NULL != sSrc1 && NULL != sSrc2); const unsigned char* s1 = (const char*)sSrc1;
const unsigned char* s2 = (const char*)sSrc2; for (;0 < num; ++s1, ++s2, --num)
{
if (*s1 != *s2)
return ((*s1 > *s2) ? 1 : -1);
}
return 0;
}

计算字符串长度

size_t strlen(const char* sSrc)
{
assert (NULL != sSrc); const char* s = sSrc, *sv = s; while (*sv != '\0')
++sv;
return (size_t)(sv - s);
}

《C标准库》——之<string.h>的更多相关文章

  1. 彻底弄清c标准库中string.h里的常用函数用法

    在我们平常写的c/c++程序,一些算法题中,我们常常会用到c标准库中string.h文件中的函数,这些函数主要用于处理内存,字符串相关操作,是很有用的工具函数.而且有些时候,在笔试或面试中也会出现让你 ...

  2. 走进C标准库(8)——"string.h"中函数的实现相关字符串操作函数

    我的strcat: char *strcat(char *dest,char *src) { char * reval = dest; while(*dest) dest++; while(*src) ...

  3. 走进C标准库(3)——"stdio.h"中的getc和ungetc

    接前文. 再来看看getc和ungetc的实现.在看这两个函数的实现之前,我们先来想一想这两个函数分别需要做的工作. int getc(FILE *stream) 说明:函数getc从stream指向 ...

  4. 走进C标准库(2)——"stdio.h"中的fopen函数

    其他的库文件看起来没有什么实现层面的知识可以探究的,所以,直接来看stdio.h. 1.茶余饭后的杂谈,有趣的历史 在过去的几十年中,独立于设备的输入输出模型得到了飞速的发展,标准C从这个改善的模型中 ...

  5. 走进C标准库(1)——assert.h,ctype.h

    默默觉得原来的阅读笔记的名字太土了,改了个名字,叫做走进C标准库. 自己就是菜鸟一只,第一次具体看C标准库,文章参杂了对<the standard C library>的阅读和对源码的一些 ...

  6. C 非标准库(conio.h)

    所谓的 C 标准库(C standard library),是指在 ISO C 或者 POSIX 标准中定义的: POSIX is a superset(超集) of the standard C l ...

  7. 走进C标准库(4)——"stdio.h"中的putc

    花了点时间把园子弄得好看了点,现在继续. 函数名: putc 功  能: 输出一字符到指定流中 用  法: int putc(int ch, FILE *stream); #define _putc_ ...

  8. 走进C标准库(5)——"stdio.h"中的其他部分函数

    函数介绍来自:http://ganquan.info/standard-c/ 函数名: freopen 功  能: 替换一个流 用  法: FILE *freopen(char *filename, ...

  9. 走进C标准库(6)——"string.h"中函数的实现memchr

    我写的memchr: void *memchr(const void *buf, char ch, unsigned count){ unsigned ; while(*(buf++) != ch & ...

  10. 走进C标准库(7)——"string.h"中函数的实现memcmp,memcpy,memmove,memset

    我的memcmp: int memcmp(void *buf1, void *buf2, unsigned int count){ int reval; while(count && ...

随机推荐

  1. jquery实现checkbox全选和全部取消,以及获取值

    在后台管理中经常会遇到列表全选和取消的功能,如评论审核.申请等,用到的html标记就是checkbox.我用的是mysql数据库,代码如下: <!DOCTYPE html PUBLIC &quo ...

  2. java多线程之 基本概念

    一.线程的五种状态 1. 新建状态(New)         : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread().2. 就绪状态(Runnable) ...

  3. JAVA第四周作业

    import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream; ...

  4. 移动端1px

    移动端不同尺寸设备dpi不同,会造成1px线条不同程度的缩放,可利用媒体查询device-pixel-ratio,进行不同情况匹配: @media(-webkit-min-device-pixel-r ...

  5. std::vector<bool>中的坑

    http://www.cplusplus.com/reference/vector/vector/?kw=vector C++中,vector<bool>为了达到节省内存的目的,专门做了特 ...

  6. cocos2dx-3.9 集成admob

    Part 1: 安装GoogleMobileAds framework (即admob) 1. 安装Cocoapods,否则解决依赖关系和配置真的会把人不累死也得烦死 sudo gem install ...

  7. WordPress

    WordPress: 1.一种使用PHP语言开发的博客平台 2.用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站 3.也可以把 WordPress当作一个内容管理系统(CMS)来使用 ...

  8. 第二章 XHTML 基础

    元素与标签术语,HTML/XHTMLXHTML之间的联系区别在XHTML中,所有元素之间必须完成正确的嵌套,元素必须是闭合的,必须小写.必须有个跟元素HTML. 标题标<h1>语法:< ...

  9. 未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序

    这种错误的可能性有几种,比如: 1.没有安装数据访问组件,需要安装相应版本的数据访问组件: 2.没有安装相应版本的Office客户端,需要安装相应版本的Office客户端: 3.Microsoft.J ...

  10. linux命令:tar

    1.命令介绍: tar用来打包,压缩和解压文件. 2.命令格式: tar [选项] 文件 3.命令参数: 必要参数有如下: -A 新增压缩文件到已存在的压缩 -B 设置区块大小 -c 建立新的压缩文件 ...