1.自己实现三个常用函数 strlen,strcpy,strstr
- 自己实现strstr函数,如果找到返回首地址,找不到则返回NULL
1 //查找元素,返回首地址 2 char *mystrstr(const char *_Str,const char *_SubStr) 3 { 4 //如果有一个为空,则返回NULL 5 if (_Str == NULL || _SubStr == NULL) 6 { 7 return NULL; 8 } 9 10 //psrc,psub保存源字符串和子字符串当前查询到的地址11 char *psrc = _Str;12 char *psub = _SubStr;13 14 //如果源字符串没有遍历晚,则继续遍历15 while (*psrc != '\0')16 {17 //创建新的临时地址,保存当前遍历到的地址18 char *ptmp_src = psrc;19 char *ptmp_sub = psub;20 int flag = 1;//首先假设字符串找到21 //如果自字符串没有遍历完,则继续遍历22 while (*ptmp_sub != '\0')23 {24 //如果源字符串提前结束,则返回NULL25 if (*ptmp_src == '\0')26 {27 return NULL;28 }29 //如果当前遍历到的不相等,则flag置0,跳出循环30 if (*ptmp_src != *ptmp_sub)31 {32 flag = 0;33 break;34 }35 else//否则同时向后移动一位36 {37 ptmp_src++;38 ptmp_sub++;39 }40 }41 //如果找到了返回首地址42 if (flag)43 {44 return psrc;45 }46 //如果没找到源字符串向后移动一位,再进行遍历47 psrc++;48 }49 50 return NULL;51 }
- 自己实现strlen函数
1 unsigned int mystrlen(const char *str) 2 { 3 int length = 0; 4 for (int i = 0;; i++) 5 { 6 if (*(str + i) == '\0') 7 { 8 break; 9 }10 length++;11 }12 return length;13 }
- 自己实现strcpy函数
1 char *mystrcpy(char *dest, const char *source) 2 { 3 if (dest == NULL || source == NULL) 4 { 5 return NULL; 6 } 7 for (int i = 0;; i++) 8 { 9 dest[i] = source[i];10 if (*(source + i) == '\0')11 { 12 break;13 }14 15 return dest;16 }17 }
2.字符串的排序以及自己实现strcmp
- 字符串的排序调用qsort
1 int compare(const void *p1, const void *p2)//传递的是数组元素的地址,类型是**,要先转化为**的指针 2 { 3 const char **pstr1 = p1; 4 const char **pstr2 = p2; 5 //去每个元素首地址比较两个字符串 6 return strcmp(*pstr1, *pstr2); 7 } 8 9 void main()10 {11 char *str[10] = { "calc","apple","run","123" ,"boat","dead","father","son","hello","2018"};12 qsort(str, 10, 4, compare);13 for (int i = 0; i < 10; i++)14 {15 puts(str[i]);16 }17 system("pause");18 }
- 字符串的排序,冒泡法
1 void main() 2 { 3 char str[10][10] = { "calc","apple","run","123" ,"boat","dead","father","son","hello","2018" }; 4 5 for (int i = 0; i < 10 - 1; i++)//控制次数 6 { 7 for (int j = 0; j < 10 - i - 1; j++)//两个两个比较,大数沉底 8 { 9 if (strcmp(str[j], str[j + 1]) > 0)10 {11 char strtemp[100] = { 0 };12 strcpy(strtemp, str[j]);13 strcpy(str[j], str[j + 1]);14 strcpy(str[j + 1], strtemp);15 }16 17 }18 }19 for (int i = 0; i < 10; i++)20 {21 puts(str[i]);22 }23 system("pause");24 }
- 自己实现strcmp
1 int mystrcmp(const char * _Str1, const char * _Str2) 2 { 3 if (_Str1 == NULL || _Str2 == NULL) 4 { 5 return 0; 6 } 7 char *pstr1 = _Str1; 8 char *pstr2 = _Str2; 9 //一直循环到两个字符不相等10 while (*pstr1 == *pstr2 && *pstr1 != '\0')11 {12 pstr1++;13 pstr2++;14 }15 //如果都到两个字符串结尾16 if (*pstr1 == '\0' && *pstr2 == '\0')17 {18 return 0;19 }20 //如果有一个到结尾21 else if (*pstr1 == '\0' && *pstr2 != '\0')22 {23 return -1;24 }25 else if (*pstr1 != '\0' && *pstr2 == '\0')26 {27 return 1;28 }29 //如果都没到结尾30 else 31 {32 return *pstr1 > *pstr2 ? 1 : -1;33 }34 }
不常用的字符串函数
- 自己实现strset(char *p,char ch):填充字符串
1 void mystrset(char *p, char ch)2 {3 while (*p!=NULL)4 {5 *p = ch;6 p++;7 }8 9 }
- 自己实现strrev(char *p)
1 void mystrrev(char *p)2 {3 int len = strlen(p);4 for (int i = 0; i < len/2; i++)5 {6 p[i] = p[len - 1 -i];7 }8 }
- 自己实现_strlwr(字符串大写转小写)
1 void mystrlwr(char *p) 2 { 3 while (*p != '\0') 4 { 5 if (*p >= 'A' && *p <= 'Z') 6 { 7 (*p) += 32; 8 } 9 p++;10 }11 }
- 自己实现_strupr(字符串小写转大写)
1 void mystrupr(char *p) 2 { 3 while (*p != '\0') 4 { 5 if (*p >= 'a' && *p <= 'z') 6 { 7 (*p) -= 32; 8 } 9 p++;10 }11 }