手打C库头文件 string.h
我是标题党,其实是只实现了部分函数
本人实力不济,不会讲解(绝对不是我懒)
只能直接贴上代码:
/* 未经测试,准确率无法保证(如有错误,欢迎指出) 其中 strcoll(), strerror(), strxfrm() 无法实现 */ #if !defined My_cstring && !defined _INC_STRING #define My_cstring #define _INC_STRING #ifndef size_t #ifdef _WIN64 typedef unsigned long long size_t; #else typedef unsigned int size_t; #endif #endif #ifdef __cplusplus //判断一下是不是C++,是的话用C语言编译 extern "C" { #endif //声明 void *memchr(const void *str,int c,size_t n); //在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置 int memcmp(const void *str1, const void *str2, size_t n); // 把 str1 和 str2 的前 n 个字节进行比较 void *memcpy(void *dest, const void *src, size_t n); //从 src 复制 n 个字符到 dest void *memmove(void *dest, const void *src, size_t n); //从 src 复制 n 个字符到 dest (更安全) void *memset(void *str, int c, size_t n); //将指定的值 c 复制到 str 所指向的内存区域的前 n 个字节中 char *strcat(char *dest, const char *src); //把 src 所指向的字符串追加到 dest 所指向的字符串的结尾 char *strncat(char *dest, const char *src, size_t n); //把 src 所指向的字符串追加到 dest 所指向的字符串的结尾,直到 n 字符长度为止 char *strchr(const char *str, int c); //在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置 int strcmp(const char *str1, const char *str2); //把 str1 所指向的字符串和 str2 所指向的字符串进行比较 int strncmp(const char *str1, const char *str2, size_t n); //把 str1 和 str2 进行比较,最多比较前 n 个字节 int strcoll(const char *str1, const char *str2); //把 str1 和 str2 进行比较,结果取决于 LC_COLLATE 的位置设置 char *strcpy(char *dest, const char *src); //把 src 所指向的字符串复制到 dest char *strncpy(char *dest, const char *src, size_t n); //把 src 所指向的字符串复制到 dest,最多复制 n 个字符 size_t strcspn(const char *str1, const char *str2); //检索字符串 str1 开头连续有几个字符都不含字符串 str2 中的字符 char *strerror(int errnum); //从内部数组中搜索错误号 errnum,并返回一个指向错误消息字符串的指针 size_t strlen(const char *str); //计算字符串 str 的长度,直到空结束字符,但不包括空结束字符 char *strpbrk(const char *str1, const char *str2); //检索字符串 str1 中第一个匹配字符串 str2 中字符的字符,不包含空结束字符。也就是说,依次检验字符串 str1 中的字符,当被检验字符在字符串 str2 中也包含时,则停止检验,并返回该字符位置 char *strrchr(const char *str, int c); //在参数 str 所指向的字符串中搜索最后一次出现字符 c(一个无符号字符)的位置 size_t strspn(const char *str1, const char *str2); //检索字符串 str1 中第一个不在字符串 str2 中出现的字符下标。 char *strstr(const char *haystack, const char *needle); //在字符串 haystack 中查找第一次出现字符串 needle(不包含空结束字符)的位置 char *strtok(char *str, const char *delim); //分解字符串 str 为一组字符串,delim 为分隔符 size_t strxfrm(char *dest, const char *src, size_t n); //根据程序当前的区域选项中的 LC_COLLATE 来转换字符串 src 的前 n 个字符,并把它们放置在字符串 dest 中 //实现 size_t strlen(const char *str) { char *ret=str; while(ret!='\0') ret++; return ret-str; } void *memchr(const void *str,int c,size_t n) { void *ret=str; while(n&&(*(unsigned char *)ret != (unsigned char)c) ) ret=(unsigned char *)ret+1,n--; if(!n) return NULL; return (void *)ret; } int memcmp(const void *str1, const void *str2, size_t n) { void *st1=str1,*st2=str2; whiel(n&&(*(char *)st1 != *(char *)st2) ) st1=(char *)st1+1,st2=(char *)st2+1,n--; if(n==0) return 0; else return *(char *)st1 - *(char *)st2; // if(*(char *)st1 < *(char *)st2) return -1; // else return 1; } void *memcpy(void *dest, const void *src, size_t n) { void *sr=src,*ret=dest; while(n--) *(char *)dest=*(char *)sr,dest=(char *)dest+1,sr=(char *)sr+1; return ret; } void *memmove(void *dest, const void *src, size_t n) { void *sr=(char *)src+n-1,*ret=dest; dest=(char *)dest+n-1; while(n--) *(char *)dest=*(char *)src,dest=(char *)dest+1,sr=(char *)sr+1; return ret; } void *memset(void *str, int c, size_t n) { void *ret=str; while(n--) *(char *)str=c,str=(char *)str+1; return ret; } char *strcat(char *dest, const char *src) { // return strcpy(dest+strlen(dest),src); char *ret=dest,*sr=src; while(*dest!='\0') dest++; while(*sr!='\0') *dest=*sr,dest++,sr++; return ret; } char *strncat(char *dest, const char *src, size_t n) { char *ret=dest,*sr=src; while(*dest!='\0') dest++; while(*sr!='\0'&&n--) *dest=*sr,dest++,sr++; return ret; } char *strchr(const char *str, int c) { // return memchr(str,c,strlen(str)); char *ret=str; while(*ret!='\0'&& *ret != c) ret++; if(*ret == c) return ret; else NULL; } int strcmp(const char *str1, const char *str2) { // return memcmp(str1,str2,strlen(str1)); char *st1=str1,*st2=str2; while(*st1==*st2) st1++,st2++; if(*st1==*st2) return 0; else return *st1-*st2; } int strncmp(const char *str1, const char *str2, size_t n) { // return memcmp(str1,str2,n); char *st1=str1,*st2=str2; while(n&&*st1==*st2) st1++,st2++,n--; if(*st1==*st2) return 0; else return *st1-*st2; } char *strcpy(char *dest, const char *src) { // return memcpy(dest,src,strlen(src)); char *ret=dest,*str1=dest,*str2=src; while(*str1!='\0') str1++; while(*str2!='\0') *str1=*str2,str1++,str2++; return ret; } char *strncpy(char *dest, const char *src, size_t n) { // return memcpy(dest,src,n); char *sr=src,*ret=dest; while(n--) *dest=*sr,dest++,sr++; return ret; } size_t strcspn(const char *str1, const char *str2) { char *st1=str1,*st2; int count=0; while(*st1!='\0') { st2=str2; while(*st2!='\0') { if(*st2==*st1) break; st2++; } if(*st2==*st1) break; count++,st1++; } return count; } char *strpbrk(const char *str1, const char *str2) { char *st1=str1,*st2; while(*st1!='\0') { st2=str2; while(*st2!='\0') { if(*st2==*st1) break; st2++; } if(*st2==*st1) break; st1++; } if(*st2==*st1) return st1; else return NULL; } char *strrchr(const char *str, int c) { char *ret=str; while(*ret!='\0') ret++; while(ret!=str&& *ret != c) ret--; if(*ret == c) return ret; else NULL; } size_t strspn(const char *str1, const char *str2) { char *st1=str1,*st2; int count=0; while(*st1!='\0') { st2=str2; while(*st2!='\0') { if(*st2!=*st1) break; st2++; } if(*st2!=*st1) break; count++,st1++; } return count; } char *strstr(const char *haystack, const char *needle) { char *s1,*s2,*p=haystack; while(*p!='\0') { s1=p,s2=needle; while(*s1!='\0'&&*s2!='\0'&& *s1==*s2) s1++,s2++; if(*s2=='\0') return p; p++; } return NULL; } char *strtok(char *str, const char *delim) { char *st=strstr(str,delim),*del=delim; if(st==NULL) return NULL; while(*del!='\0') *st='\0',del++; return str; } #ifdef __cplusplus } #endif #endif
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步