zoukankan      html  css  js  c++  java
  • 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 != '')
    16     {
    17         //创建新的临时地址,保存当前遍历到的地址
    18         char *ptmp_src = psrc;
    19         char *ptmp_sub = psub;
    20         int flag = 1;//首先假设字符串找到
    21         //如果自字符串没有遍历完,则继续遍历
    22         while (*ptmp_sub != '')
    23         {
    24             //如果源字符串提前结束,则返回NULL
    25             if (*ptmp_src == '')
    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) == '')
     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) == '')
    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 != '')
    11     {
    12         pstr1++;
    13         pstr2++;
    14     }
    15     //如果都到两个字符串结尾
    16     if (*pstr1 == '' && *pstr2 == '')
    17     {
    18         return 0;
    19     }
    20     //如果有一个到结尾
    21     else if (*pstr1 == '' && *pstr2 != '')
    22     {
    23         return -1;
    24     }
    25     else if (*pstr1 != '' && *pstr2 == '')
    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 != '')
       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 != '')
       4     {
       5         if (*p >= 'a' && *p <= 'z')
       6         {
       7             (*p) -= 32;
       8         }
       9         p++;
      10     }
      11 }
  • 相关阅读:
    Redis学习笔记
    RedisTemplate操作命令
    RedisTemplate操作命令
    RedisTemplate操作命令
    RedisTemplate操作命令
    将chrome储存的密码转为MarkDown表格
    使用redisson做redis分布式锁
    RocketMQ 整合SpringBoot发送事务消息
    关于java读写锁的测试
    java8 stream记录
  • 原文地址:https://www.cnblogs.com/xiaochi/p/8337868.html
Copyright © 2011-2022 走看看