38.C语言字符串总结
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 //如果源字符串提前结束,则返回NULL 25 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 }