1.strlen:求字符串长度
>直接用计算器实现:
int my_strlen(const char *str) { int count = 0; while (*str){ count++; str++; } return count; }
>不创建临时变量的计数器:通过递归
int my_strlen(const char *str) { if (*str=='\0'){ return 0; } else return 1 + my_strlen(str + 1); }
>指针-指针:
int my_strlen(const char *str) { char *p = str; //p指向首元素 while (*p != '\0'){ p++; } return p - str; }
2.strcpy和strncpy:字符串拷贝:
>strcpy:将str1串复制到str2串中
char *my_strcpy(char *dest, const char *str) { assert(dest); assert(str); while (*dest = *str){ dest++; str++; } return dest; }
>strncpy:将字符串str1中指定长度复制到字符串2中:
如果指定长度大于串str1的长度,则拷贝完后再串str2后补0,直到和指定长度相等。
char *my_strncpy(char *dest,const char*str,int size) { assert(dest); assert(str); assert(size > 0); while (size--){ *dest = *str; dest++; str++; } *dest = '\0'; return dest; }
3.strcat和strncat:字符串拼接:
先使被拼接的字符串(dest)指向'\0',然后将要拼接的字符串(str)依次拷贝到dest后。
>strcat函数:
char *my_strcat(char *dest, const char *str) { char *ret =dest; assert(dest); assert(str); while (*dest){ dest++; } while (*dest = *str){ dest++; str++; } return ret; }
>strncat函数:将字符串str1中指定长度拼接到字符串2中。
char *my_strncat(char*dest,const char *str,int size) { assert(dest); assert(str); assert(size > 0); while (*dest){ dest++; } while (size && (*dest =*str)){ dest++; str++; size--; } return dest: }
4.strcmp和strncmp:字符换比较:
通过字符在ASCLL表中的位置序号进行差运算比较。比较的是ASCLL中的位置:如abcg小于abcz。
>strcmp函数:
int my_strcmp(const char *str1,const char *str2) { int ret = 0; while ((!(ret = *(unsigned char*)str1 - *(unsigned char*)str2)&&str1)) //一相等为基础 { str1++; str2++; } if (ret > 0) ret = 1; else if (ret<0) ret = -1; return (ret); }
>strncmp函数:
比较出现另一个字符不一样或者一个字符串结束或者size个字符全部比较完。
int my_strncmp(const char *dest,const char *str,int size) { assert(dest); assert(str); assert(size > 0); int ret; while (size&&(!(ret=*dest-*str))){ dest++; str++; size--; } return ret > 0 ? 1 : ret < 0 ? -1 : 0; }5.strstr:查找并返回子串。
在str1中查找str2并返回,str1中str2所在字符串之后的所有字符串。定义一个指针变量s指向str1,然后s与str2中的字符进行比较,如果一直比较到'\0'那么就返回str1,如果比较遇到不相等,则s指向str1的第二个字符重新开始比较。
char *my_strstr(char *str1, const char *str2) { assert(str1); assert(str2); char *p = (char*)str1; char *q = (char *)str2; char *s = NULL; while (*p){ s = p; q = str2; while (*s&&*q && (*s == *q)){ s++; q++; } if (*q == '\0') return p; p++; } return 0; }
6.strchr和strrchr:查找某个字符出现的位置。
>strchr函数:查找第一次字符出现的位置如果字符出现多次,以第一次找到的位置为主。
#include<stdio.h> #include<Windows.h> #include<assert.h> char *my_strchr(const char*str, int c) { assert(str); while (*str){ if (*str == (char)c){ return (char*)str; } str++; } return 0; } int main(){ char *str1 = "abcdef"; char c = 'd'; char *ret = my_strchr(str1,c); //返回的是当前字符的位置 printf("%d\n", ret-str1+1); //找到字符的位置减去首元素的位置加1就是当前字符在字符串中的位置 system("pause"); return 0; }
>strrchr:查找字符最后一次出现的位置并返回位置;从后往前找。
#include<stdio.h> #include<Windows.h> #include<assert.h> char *my_strrchr(const char *dest, int c) { assert(dest); char *str = dest + strlen(dest); while (str--){ if (*str == (char)c){ return (char*)str; break; } } } int main(){ char *str = "holle world i love chnia"; int c = 'd'; char*p=my_strrchr(str, c); printf("%d\n", p - str + 1); system("pause"); return 0; }
7.strpbrk:返回第一个字符串中第一个出现在第二个字符串中的字符的地址。
char *my_strpbrk(const char *str1, const char *str2) { assert(str1); assert(str2); const char *p1, *p2; for (p1 = str1; *p1 != '\0'; p1++) { for (p2= str2; *p2 != '\0'; p2++) { if (*p1 == *p2) { return (char *)p1; } } } return NULL; }
8.strspn和strcspn:
>strspn函数检索字符串 str1 中第一个不在字符串 str2 中出现的字符下标。
返回的是str1字符串中开始部分匹配str2字符串中字符的个数
int my_strspn(const char*str1, const char *str2) { assert(str1); assert(str2); char *str = str1; while (*str){ while (*str2 && (*str != *str2)) str2++; if (*str == *str2) break; str++; } return str - str1; }
>strcspn: 检索字符串 str1 开头连续有几个字符都不含字符串 str2 中的字符。
返回 str1 开头连续都不含字符串 str2 中字符的字符数.
int my_strspn(const char*str1, const char *str2) { assert(str1); assert(str2); char *str = str1; while (*str&&*str != *str2){ str2++; str++; } return str - str1; }9.模拟实现strtok:
(1)sep参数是个字符串,定义了用作分隔符的字符集合 (2)第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。 (3)strtok函数找到str中的下一个标记,并将其用’\0’结尾,返回一个指向这个标记的指针。 (4)strtok函数的第一个参数不为NILL,函数找到str中第一个标记,strtok函数将保存它在字符串中的位置。 (5)strtok函数的第一个参数为空,函数将在同一个字符中被保存的位置开始,查找下一个标记。 (6)如果字符串不存在更多的标记,则返回NULL指针。
#include<stdio.h> #include<Windows.h> #include<string.h> int main(){ char str[] = "- this, a sample string."; char *sep = "- ,."; char *p = strtok(str, sep); while (p != NULL){ printf("%s\n", p); p = strtok(NULL, sep); } system("pause"); return 0; }
10.strerror:通过标准错误的标号,获得错误的描述字符串 ,将单纯的错误标号转为字符串描述,方便用户查找错误。
返回错误码所对应的错误信息
#include<stdio.h> #include<Windows.h> #include<string.h> #include<errno.h> #pragma warning( disable : 4996) int main(){ FILE *pFile; pFile = fopen("unexist.ent", "r"); if (pFile == NULL){ printf("Error opean file unexist.ent:%s\n", strerror(errno)); } system("pause"); return 0; }