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 = ;//首先假设字符串找到
  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 = ;
  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 = ;
  4. for (int i = ;; 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 = ;; 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[] = { "calc","apple","run","" ,"boat","dead","father","son","hello",""};
  12. qsort(str, , , compare);
  13. for (int i = ; i < ; i++)
  14. {
  15. puts(str[i]);
  16. }
  17. system("pause");
  18. }
  • 字符串的排序,冒泡法
  1. void main()
  2. {
  3. char str[][] = { "calc","apple","run","" ,"boat","dead","father","son","hello","" };
  4.  
  5. for (int i = ; i < - ; i++)//控制次数
  6. {
  7. for (int j = ; j < - i - ; j++)//两个两个比较,大数沉底
  8. {
  9. if (strcmp(str[j], str[j + ]) > )
  10. {
  11. char strtemp[] = { };
  12. strcpy(strtemp, str[j]);
  13. strcpy(str[j], str[j + ]);
  14. strcpy(str[j + ], strtemp);
  15. }
  16.  
  17. }
  18. }
  19. for (int i = ; i < ; 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 ;
  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 ;
  19. }
  20. //如果有一个到结尾
  21. else if (*pstr1 == '\0' && *pstr2 != '\0')
  22. {
  23. return -;
  24. }
  25. else if (*pstr1 != '\0' && *pstr2 == '\0')
  26. {
  27. return ;
  28. }
  29. //如果都没到结尾
  30. else
  31. {
  32. return *pstr1 > *pstr2 ? : -;
  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 = ; i < len/; i++)
    5. {
    6. p[i] = p[len - -i];
    7. }
    8. }
  • 自己实现_strlwr(字符串大写转小写)
    1. void mystrlwr(char *p)
    2. {
    3. while (*p != '\0')
    4. {
    5. if (*p >= 'A' && *p <= 'Z')
    6. {
    7. (*p) += ;
    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) -= ;
    8. }
    9. p++;
    10. }
    11. }

38.C语言字符串总结的更多相关文章

  1. C.【转】C语言字符串与数字相互转换

    1.gcvt 把浮点数转成字符串 - CSDN博客.html(https://blog.csdn.net/dxuehui/article/details/52791412) 1.1. 函数名: gcv ...

  2. C语言字符串操作总结大全(超详细)

    本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作  strcpy(p, p1) 复制字符串  strncpy(p, p1, n) 复制指定长度字符串  strcat( ...

  3. C语言字符串拷贝

    C语言字符串拷贝利用指针操作,要清楚知道指针的指向 代码如下: #include <stdio.h> #include <assert.h> #include <stri ...

  4. C语言字符串长度(转)

    C语言字符串长度的计算是编程时常用到的,也是求职时必考的一项. C语言本身不限制字符串的长度,因而程序必须扫描完整个字符串后才能确定字符串的长度. 在程序里,一般会用strlen()函数或sizeof ...

  5. C语言字符串操作常用库函数

    C语言字符串操作常用库函数 *********************************************************************************** 函数 ...

  6. c语言字符串操作大全

     C语言字符串操作函数 函数名: strcpy 功  能: 拷贝一个字符串到另一个 用  法: char *stpcpy(char *destin, char *source); 程序例: #incl ...

  7. 转:C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文

    转自:C语言字符串操作函数 - strcpy.strcmp.strcat.反转.回文 C++常用库函数atoi,itoa,strcpy,strcmp的实现 作者:jcsu C语言字符串操作函数 1. ...

  8. C 语言字符串连接的 3种方式

    C 语言字符串连接的 3种方式 #include<stdio.h> #include<stdlib.h> #include<string.h> char *join ...

  9. C语言字符串声明

    重新学习C语言字符串声明char *a="nihao";char a[]="nihao";什么区别?前者定义的是指针,并且指向字符串常量“nihao”,后者是字 ...

随机推荐

  1. HDFS的底层原理

  2. 【转载】AngularJS 用$sce服务来过滤HTML标签,解决无法正确显示后台传递的html标签

    angular js的强大之处之一就是他的数据双向绑定这一牛B功能,我们会常常用到的两个东西就是ng-bind和针对form的ng-model.但在我们的项目当中会遇到这样的情况,后台返回的数据中带有 ...

  3. PostgreSQL Replication之第一章 理解复制概念(2)

    1.2不同类型的复制 现在,您已经完全地理解了物理和理论的局限性,可以开始学习不同类型的复制了. 1.2.1 同步和异步复制 我们可以做的第一个区分是同步复制和异步复制的区别. 这是什么意思呢?假设我 ...

  4. kotlin MutableList sort

    fun MutableList<Int>.swap(index1: Int, index2: Int) {val tmp = this[index1] // 'this' correspo ...

  5. hiho147周 - 数据结构 bitset

    题目链接 n个5维数,对于每个数,输出小于他的数的个数(每个维度都比他小); #include <cstdio> #include <cstring> #include < ...

  6. es6 学习1 let表示变量 、const表示常量 与 var 变量的区别

    一.let 1.看下代码,在函数中无论在哪里声明变量,都会自动提到函数顶部,这就是函数变量提升,它的作用于为当前函数中. function aa() { if(bool) { var test = ' ...

  7. 企业级Nginx+Keepalived集群实战(双主架构)

    随着Nginx在国内的发展潮流,越来越多的互联网公司都在使用Nginx,Nginx高性能.稳定性成为IT人士青睐的HTTP和反向代理服务器.Nginx负载均衡一般位于整个网站架构的最前端或者中间层,如 ...

  8. echarts 初始化失败问题。

    dom 实例容器,一般是一个具有高宽的div元素. 注:如果div是隐藏的,ECharts 可能会获取不到div的高宽导致初始化失败,这时候可以明确指定div的style.width和style.he ...

  9. OpenGL 获取当前屏幕坐标对应的三维坐标

    转自原文 OpenGL 获取当前屏幕坐标对应的三维坐标,使用很简单glu库中的一个函数 #include <GL/glut.h> #include <stdlib.h> #in ...

  10. Snail—UI学习之导航视图控制器UINavigationController(系统)

    背景 有一个根视图控制器 然后跳转到第一个界面  第一个界面能够返回到根视图 也能够跳转到第二个视图 第二个视图能够直接返回到根视图 新建三个ViewController    RootViewCon ...