c++ 头文件<cstring>(或者string.h)中的常见函数的实现!
来源:互联网 发布:广联达电力预算软件 编辑:程序博客网 时间:2024/03/28 17:53
下面是一些<cstring>中的常见函数的实现,本人已经测试过了,如有问题,望高手批评指正,函数封装于名字空间mystd中。(建议文件命名为"cstring.h",好记忆,而且与标准库并不冲突!)
下面贴代码!!!
// 此文件可以命名为"cstring.h" (这与标准库的<cstring>并不冲突)// vs2012 调试通过#pragma once #ifndef MYSTD_CSTRING_H#define MYSTD_CSTRING_H#include<cassert> // assert #include<cstddef> // std::size_t#define MYSTD_BEGIN namespace mystd{#define MYSTD_END }#ifdef __cplusplus //封装于名字空间mystd中MYSTD_BEGINtypedef std::size_t size_type;typedef unsigned char UCHAR;// C语言版本,void * memchr(const void *,int,size_type); inline const void* memchr(const void *pointer,int val, size_type num){assert(pointer != 0);UCHAR *ptr = (UCHAR*)pointer; for(size_type i = 0; i < num; ++i){if(*ptr == val)break;++ptr;}return ptr;} inline void* memchr(void *pointer, int val,size_type num) //c++重载{assert(pointer != 0);return (void*)mystd::memchr((const void*)pointer,val,num); // 转调}inline size_type strlen(const char *str){assert(str != 0);size_type count = 0;while(*str++)++count;return count;}inline void* memmove(void *destination,const void *source, size_type num){ // 对于memmove函数的实现,c++之父在《c++ 程序设计语言》(十周年中文纪念版第16章开篇) //就说过,此函数无法由c++语言本身达到最优实现,实际应用时还是用标准库吧! assert(destination != 0 && source != 0); if(destination == source || num == 0)return destination;UCHAR *des = (UCHAR*)destination; const UCHAR *src = (UCHAR*)source; if(des < src || des >= src + num) {while(num--)*des++ = *src++;return destination;}des += num;src += num;while(num--) // 倒序复制*--des = *--src;return destination;}inline void* memcpy(void *destination,const void *source, size_type num){assert(destination != 0 && source != 0);return mystd::memmove(destination,source,num);}inline int memcmp(const void *pointer_1,const void *pointer_2,size_type num){assert(pointer_1 != 0 && pointer_2 != 0);const UCHAR *ptr_1 = (UCHAR*)pointer_1;const UCHAR *ptr_2 = (UCHAR*)pointer_2;while(num-- && *ptr_1 == *ptr_2)++ptr_1,++ptr_2;if(num == size_type(-1))return 0;elsereturn *ptr_1 - *ptr_2;}inline void* memset(void *pointer,int val,size_type num){assert(pointer != 0);UCHAR *ptr = (UCHAR*)pointer;while(num--)*ptr++ = val;return pointer;}inline char* strcat(char *destination,const char *source){assert(destination != 0 && source != 0);char *ptr = destination + mystd::strlen(destination);while(*ptr++ = *source++);return destination;}inline char *strncat(char *destination,const char *source,size_type num){assert(destination != 0 && source != 0);char *ptr = destination + mystd::strlen(destination);while(num-- && *source)*ptr++ = *source++;*ptr = 0; // null-character 复制return destination;}inline char *strcpy(char *destination,const char *source){assert(destination != 0 && source != 0);char *des = destination;while(*des++ = *source++); return destination; // null-character被复制}inline char *strncpy(char *destination,const char *source,size_type num){assert(destination != 0 && source != 0);char *des = destination;while(num--)*des++ = *source++; return destination; // null-character可能没有被复制}inline int strcmp(const char *str1,const char *str2){ assert(str1 != 0 && str2 != 0); while(*str1 && *str1 == *str2) ++str1, ++str2; return *str1 - *str2;}inline int strncmp(const char *str1,const char *str2,size_type num){assert(str1 != 0 && str2 != 0);while(num-- && *str1 && *str1 == *str2)++str1, ++str2;if(num == size_type(-1)) // 包含了num == 0的情况return 0;elsereturn *str1 - *str2;}//C语言只有一个版本 char* strchr(const char *, int); inline const char* strchr(const char *str,int character){assert(str != 0);// 语言标准规定character 为int,这里转换一下const char chr = *(char*)&character;while(*str && *str != chr) ++str;if(*str)return str;elsereturn 0;} inline char* strchr(char *str,int character) //c++重载{assert(str != 0);return (char*)mystd::strchr((const char*)str,character);}inline const char* strrchr(const char *str,int character){ //这里的character 可能包括null-characterassert(str != 0);// 语言标准规定character 为int,这里转换一下const char chr = *(char*)&character;// const char chr = (char)character; // 也可以这样size_type len = mystd::strlen(str);const char *ptr = str + len;if(chr == 0)return ptr;--ptr;while(len--)if(*ptr == chr)return ptr;else--ptr;return 0; //无匹配的字符} inline char* strrchr(char *str,int character){assert(str != 0);return (char*)mystd::strrchr((const char*)str,character); // 转调}//c语言版本char* strstr(const char *,const char*);inline const char* strstr(const char* str1,const char* str2){assert(str1 != 0 && str2 != 0);size_type len_1 = mystd::strlen(str1);size_type len_2 = mystd::strlen(str2);if(len_1 < len_2) return 0;const char *search_last = str1 + (len_1 - len_2);while(str1 <= search_last){if(mystd::strncmp(str1,str2,len_2) == 0)return str1;else++str1;}return 0;} inline char* strstr(char *str1,const char *str2) //c++重载{assert(str1 != 0 && str2 != 0);return (char*)mystd::strstr((const char*)str1,str2);}inline bool is_inside(const char *str,char chr) // 辅助函数,内部使用{assert(str != 0);while(*str){if(*str == chr)return true;else ++str;}return false;}inline size_type strspn(const char* str1,const char *str2){assert(str1 != 0 && str2 != 0);size_type count = 0;while(*str1 && is_inside(str2,*str1)) ++count, ++str1;return count;}inline size_type strcspn(const char* str1,const char *str2){assert(str1 != 0 && str2 != 0);size_type count = 0;while(*str1 && !is_inside(str2,*str1))++count, ++str1;return count;}// c语言版本char* strpbrk(const char *,const char *); inline const char* strpbrk(const char *str1,const char *str2){assert(str1 != 0 && str2 != 0);while(*str1 && !is_inside(str2,*str1))++str1;if(*str1 == 0)return 0;elsereturn str1;} inline char* strpbrk(char *str1,const char *str2) //c++重载{assert(str1 != 0 && str2 != 0);return (char*)strpbrk((const char*)str1,str2); //转调}MYSTD_END // end of namespace mystd #endif // __cplusplus #endif // MYSTD_CSTRING_H
下面是一个简单的测试程序:
#include<iostream>#include"cstring.h" //自写版本#include<cstring> // 标准库#define STD mystd // 更改为std可以调用标准库版本using std::cout;using std::endl;int main(){char buf[100];const char* str = "hello world";STD::memset(buf,0,sizeof(buf));STD::memcpy(buf,str,STD::strlen(str));cout<<buf<<endl;if(STD::strncmp(str,buf,STD::strlen(str)) == 0)cout<<"str 等于 buf"<<endl;system("pause");return 0;}
本人在vs2012中测试通过。
0 0
- c++ 头文件<cstring>(或者string.h)中的常见函数的实现!
- C/C++头文件一览 &&string.h中的函数
- 头文件<string.h>、<cstring>、<string>的区别
- string/string.h/cstring头文件的区别摘要
- 头文件string.h cstring string的区别
- 头文件 string.h cstring string 区别
- 头文件 string.h cstring string 区别
- 头文件 string.h cstring string 区别
- 头文件 string.h cstring string 区别
- 头文件 string.h cstring string 区别
- 头文件 string.h cstring string 区别
- 头文件 string.h cstring string 区别
- 头文件 string.h cstring string 区别
- 头文件 string.h cstring string 区别
- 头文件 string.h cstring string 区别
- 头文件string,string.h,cstring
- 头文件 string.h cstring string 区别
- 头文件 string.h cstring string 区别
- chapter12test6
- JDeveloper 配置 No suitable driver
- opencl编程中的一个问题
- 分支与循环(3)
- 一个有趣的网站
- c++ 头文件<cstring>(或者string.h)中的常见函数的实现!
- myeclipse部署项目后,debug模式启动,总是弹出Class.class文件
- poj2406 Power Strings
- PART1 敏捷测试简介
- MFC 浏览目录的对话框 或 选择目录的对话框
- 认识自己——这从来不是我要的生活
- Analyzing dependencies 解决方案
- ObjectOutStream的reset方法
- 王师傅卖鞋子 UML 顺序图解析