最近把一些常见的c语言的字符串库函数参照着网上的程序自己实现了一下,也是方便自己复习总结,里面的实现比较经典,下面的函数在我电脑vs2005上都能通过,但未进行严格的测试。点击展开目录,可以直接达到感兴趣的函数实现。
/************************************************************************/ /* 1.strcpy函数实现 2.strncpy实现 3.strcat函数实现 4.strncat函数实现 5.strdup实现 6.strchr实现 7.strrchr函数实现 8.strpbrk函数 9.strstr实现 10.strlen实现 11.strlen另一种实现 12.strcmp函数实现 13.strcmpy的一种标准实现 14.strncpy函数实现 15.memset函数实现*/ /************************************************************************/
1.strcpy函数实现
//功能说明:将source的字符串复制到dest来 //dest所指向的空间必须有足够的内存来容纳source所指向的字符串 char * my_strcpy(char *dest, const char *source) { assert(dest!=NULL && source!=NULL); char *r = dest; //*(dest++),先返回*dest, 然后dest++ //(*(dest++) = *(source++)返回最左边表达式的值 while ((*(dest++)=*(source++)) != '\0'); return r; } /* 1.注意参数的命名上规范,让人容易明白怎么使用函数 2.第二个参数类型是const char *,防止修改源字符串 3.函数返回值是char *,可以实现链式表达式 4.参数合法性检查,下面的函数同样要遵循这些 */
2.strncpy实现
//将source的前n个字符串复制到dest char * my_strncpy(char *dest, const char *source, int n) { assert(dest!=NULL && source!=NULL); char *r = dest; //注意n--和后面一堆不能换,否则会多复制一个 while (n-- && (*(dest++)=*(source++))!='\0'); return r; }
3.strcat函数实现
//将source指向的字符串链接在dest后面 char * my_strcat(char *dest, const char *source) { assert(dest!=NULL && source!=NULL); char *r = dest; while (*(dest) != '\0') { dest++; } while ((*(dest++)=*(source++)) != '\0'); return r; }
4.strncat函数实现
//将source特定数目字符串链接到dest后面 char * my_strncat(char *dest, const char *source, int n) { assert(dest!=NULL && source!=NULL); char *r = dest; while (*(dest) != '\0') { dest++; } while (n-- && (*(dest++)=*(source++))!='\0'); return r; }
5.strdup实现
//该函数将预先配置内存,然后将制定字符串装入内存 char * my_strdup(const char *pStr) { assert(pStr != NULL); char *r = (char *)malloc(strlen(pStr)+1); if (NULL == r) { printf("Memory Failed!\n"); exit(1); } return my_strcpy(r, pStr); }
6.strchr实现
//函数功能在字符串中查找指定的第一个字符,并返回指向该字符的指针 //若未找到,则返回指向'\0'的字符串指针 char * my_strchr(const char *pStr, char ch) { assert(pStr != NULL); while (*pStr!='\0' && *pStr!=ch) { pStr++; } return (char *)pStr; }
7.strrchr函数实现
//函数功能:查找一个字符c在另一个字符串str中末次出现的位置(也就是从str的右侧开始查找字符c首次出现的位置) char * my_strrchr(const char *pStr, char ch) { assert(pStr != NULL); const char *r = NULL; while (*pStr != '\0') { if (*pStr == ch) { r = pStr; } pStr++; } return (char *)r; }
8.strpbrk函数
//函数功能:在两个字符串中寻找首次共同出现的字符,返回该字符在str1中的地址 char *my_strpbrk(const char *str1, const char *str2) { assert(str1!=NULL && str2!=NULL); const char *tmp = str2; while (*str1 != '\0' ) { tmp = str2; while (*tmp != '\0') { if (*str1 == *tmp) { return (char *)str1; } tmp++; } str1++; } return NULL; }
9.strstr实现
//若字符串2包含在字符串1里面,返回它在字符串1中的位置,否则返回NULL char * my_strstr(const char *strDes, const char *str) { assert(strDes!=NULL && str!=NULL); const char *tmpDes = NULL; const char *tmpStr = NULL; while (*strDes != '\0') { for (tmpDes=strDes, tmpStr=str; *tmpDes==*tmpStr && *tmpStr!='\0'; tmpDes++, tmpStr++) {} if ('\0' == *tmpStr) { return (char *)strDes; } strDes++; } return NULL; }
10.strlen实现
//该函数返回字符串长度,不包括后面的'\0' int my_strlen(const char *str) { assert(str != NULL); int k = 0; while (++k && *(str++)!='\0'); return k-1; }
11.strlen另一种实现
int my_strlen(const char *str) { assert(str != NULL); const char *eos = str; //eos means end of string while (*(eos++) != '\0'); return (int)(eos - str - 1); }
12.strcmp函数实现
//两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止 //s1>s2,返回值大于0,s1<s2返回值小于0,否则等于0 int my_strcmp(const char *str1, const char *str2) { assert(str1!=NULL && str2!=NULL); while (*str1!='\0' && *str2!='\0' && *str1==*str2) { str1++; str2++; } return (*str1 - *str2); }
13.strcmpy的一种标准实现
int my_strcmp(const char *str1, const char *str2) { assert(str1!=NULL && str2!=NULL); int ret = 0; while (!(ret=*(unsigned char *)str1-*(unsigned char *)str2) && *str2!='\0') { printf("%c - %c = %d\n", *str1, *str2, *str1-*str2); str1++; str2++; } if (ret > 0) { return 1; } else if (ret < 0) { return -1; } else { return 0; } }
14.strncpy函数实现
//函数比较两个字符串中前n个字符串大小 int my_strncmp(const char *str1, const char *str2, int n) { assert(str1!=NULL && str2!=NULL); if (n <= 0) { return 0; } while (--n && *str1!='\0' && *str1==*str2) { str1++; str2++; } return (*str1 - *str2); }
15.memset函数实现
//将指定内存区域的前count个字节设定为指定值 void *my_memeset(void *buffer, int c, unsigned int count) { if (count <= 0) { return buffer; } assert(buffer != NULL); char *p = (char *)buffer; while (count--) { *(p++) = (char)c; } return buffer; }
时间: 2024-10-07 05:31:20