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 }

     

posted @ 2018-01-23 21:03  喵小喵~  阅读(262)  评论(0编辑  收藏  举报