<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. 【初级】linux pwd 命令详解及使用方法实战

    pwd:查看当前工作目录 前言: Linux中用 pwd 命令来查看”当前工作目录“的完整路径,就是经常提及的所在目录,多用在生产环境多级目录中查看当前所在路径,使用此命令能给运维人员/操作人员带来很 ...

  2. 取得交换机的MAC地址

    一.首先PING交换机的IP地址 二.然后执行 ARP -a 命令 如下图:

  3. win10下安装USB-Blaster哈希值错误

    插入usb-blaster后,无法安装驱动,一直显示感叹号,更新驱动后显示“文件的哈希值不在指定的目录”这样的错误提示,解决方法如下:1.Windows键+ R,输入shutdown.exe /r / ...

  4. AspNetPager控件分页使用方法

    AspNetPager控件官方下载地址:http://www.webdiyer.com/aspnetpager/ 把控件加到项目中(添加自定义控件的方法),并把它拖放到页面上 <asp:Scri ...

  5. 使用CSS3动画属性实现360°无限循环旋转【代码片段】

    使用CSS3的animation动画属性实现360°无限循环旋转. 代码片段: <div id="test"> <img src="/CSS3/img/ ...

  6. 探索javascript----事件对象下的各种X和Y

    每次用到诸如client,screen,offset等,虽然通常都是能用对的,但是总觉得不是那么的自信没错.所以整理一下可以再需要的时候来查阅. 一:clientX和clientY,screenX和s ...

  7. C# DataGridView使用记录分享

    最近使用DataGridView,把其中遇到的问题和一些知识记录下来,以便以后用到的时候可以快速的想起. 1.添加行号 有时我们在使用DataGridView时会被要求添加在每一行数据前面添加上行号, ...

  8. 题目1203:IP地址

    题目: http://ac.jobdu.com/problem.php?pid=1203 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3052 解决:1504 题目描述: 输入一个ip地 ...

  9. Discuz插件开发中的困惑

    1.关于缓存 这几天一直纠结于Discuz的缓存问题,今天终于有点小发现:首先Discuz的缓存可以通过数据库.文件等方式进行!在Discuz的配置文件config_global.php中有一个配置项 ...

  10. Linux下查看tomcat连接数 .

    netstat -na | grep ESTAB | grep 80 | wc -l 80是端口号