1.strlen:计算字符串长度(不包含'\0')

实现想法:遍历字符串,直到'\0'结束

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. //指针法
  6. unsigned int mystrlenaddr(const char * str) //为什么使用const char,我们只计数不对原数据进行改变
  7. {
  8. int length = ; //长度初始化为0
  9. while (*str++)
  10. {
  11. length++;
  12. }
  13. return length;
  14. }
  15.  
  16. void main()
  17. {
  18. char * str = "fengcong is fucking too handsome"; //32个
  19. //printf("%d\n", strlen(str));
  20. printf("%d\n", mystrlenaddr(str));
  21.  
  22. system("pause");
  23. }

2.strcmp:比较字符串大小(一般用于字符串排序)

实现想法:依次从字符串开始一直找到不同的那个字符进行比较,得出大小

  1. #include<string.h>
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4.  
  5. //掌握指针法
  6. int mystrcmp(char const * str1, const char * str2)
  7. {
  8. while (*str1 == *str2 && *str1 != '') //一直找到两个字符串不同的地方
  9. {
  10. str1++;
  11. str2++;
  12. }
  13. if (*str1 > *str2)
  14. return ;
  15. else if (*str1 < *str2)
  16. return -;
  17. else
  18. return ;
  19. }
  20.  
  21. void main()
  22. {
  23. char * str = "feng1";
  24. char * str1 = "feng2";
  25.  
  26. //printf("%d\n", strcmp(str, str1));
  27.  
  28. printf("%d\n", mystrcmp(str, str1));
  29.  
  30. system("pause");
  31. }

3.strcpy:用于字符串复制(复制包含'\0')

实现想法:一直复制到'\0'结束

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdlib.h>
  3. #include<stdio.h>
  4. #include<string.h>
  5.  
  6. //指针法
  7. char * mystrcpyaddr(char * dest, const char * source)
  8. {
  9. if (dest == NULL || source == NULL)
  10. {
  11. return NULL; //如果目的操作或者源为空,那么久直接返回
  12. }
  13.  
  14. while (*dest++ = *source++) //装X写法
  15. ;
  16. return dest;
  17. }
  18.  
  19. //下标法
  20. char * mystrcpyindex(char * dest, const char * source)
  21. {
  22. if (dest == NULL || source == NULL)
  23. {
  24. return NULL; //如果目的操作或者源为空,那么久直接返回
  25. }
  26. int i = ;
  27. while (source != '\0')
  28. {
  29. dest = source;
  30. i++;
  31. }
  32. dest = source; //因为要把最后的\0拷贝过去
  33. return dest;
  34. }
  35.  
  36. void main()
  37. {
  38. char * str = "fengcong is fucking too handsome";
  39. char str1[]; //目的字符数组
  40. //strcpy(str1, str);
  41. //printf("%s\n", str1);
  42. mystrcpyindex(str1, str);
  43. printf("%s\n", str1);
  44.  
  45. system("pause");
  46. }

4.strstr:寻找母串中是否存在某个子串(稍难)

实现想法:依次比对

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. //下标 法
  6. char * mystrstrindex(char * const momstr, const char * const sonstr)//前者指针指向的数据可变,但是指针不可变,后者都不可变
  7. {
  8. int momlen = strlen(momstr); //母串的长度
  9. int sonlen = strlen(sonstr); //子串的长度
  10.  
  11. for (int i = ; i < (momlen - sonlen); i++) //从0开始循环母串,到momlen-sonlen停止
  12. {
  13. int flag = ;
  14. for (int j = ; j < sonlen; j++)
  15. {
  16.  
  17. if (momstr[i + j] != sonstr[j])
  18. {
  19. flag = ;
  20. break; //如果出现不相等就 退出循环,继续从下面一个寻找
  21. }
  22. }
  23. if (flag)
  24. {
  25. return (&momstr);
  26. }
  27. }
  28. return NULL;
  29. }
  30.  
  31. //指针法
  32. char * mystrstraddr(char * const momstr, const char * const sonstr)
  33. {
  34. char * mstr = momstr; //母串
  35.  
  36. while (*mstr)
  37. {
  38. char * sstr = sonstr; //子串
  39. char * momnowstr = mstr; //记录现在母串的位置
  40. int flag = ;
  41. while (*sstr != )
  42. {
  43. if (*sstr != *momnowstr || *momnowstr == '')
  44. {
  45. flag = ;
  46. break;
  47. }
  48. momnowstr++;
  49. sstr++;
  50. }
  51. if (flag)
  52. {
  53. return mstr;
  54. }
  55.  
  56. mstr++; //母串对比位置+1
  57. }
  58. return NULL;
  59. }
  60.  
  61. void main()
  62. {
  63. char * str = "fengcong is too fucking handsome";
  64. //printf("%p", strstr(str, "fengcong"));
  65. //printf("%p", mystrstrindex(str, "engcong"));
  66. printf("%p", mystrstraddr(str, "some"));
  67.  
  68. system("pause");
  69. }

5.itoa:整数转字符串

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdlib.h>
  3. #include<stdio.h>
  4. #include<string.h>
  5.  
  6. char * myitoa(int value, char * str)
  7. {
  8. char * pstr = str; //str本身不能改变,一会要返回str
  9. if (value < )
  10. {
  11. *pstr = '-';
  12. pstr++;
  13. value *= -; //转变为正数处理
  14. }
  15. int wei = ; //数至少一位
  16. int ivalue = value; //用于测试长度
  17. while ((ivalue /= ) != )
  18. {
  19. wei++;
  20. }
  21.  
  22. pstr += wei-;
  23. while (value % != )
  24. {
  25. *pstr-- = (value % )+'';
  26. value /= ;
  27. }
  28. return str;
  29. }
  30.  
  31. void main()
  32. {
  33. int num = -;
  34. char str[] = { };
  35.  
  36. printf("%s", myitoa(num, str));
  37.  
  38. system("pause");
  39. }

6.atoi:字符串转整数(遇到非数字字符结束)

  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #include<string.h>
  4.  
  5. int myatoi(const char * str)
  6. {
  7. if (str == NULL)
  8. {
  9. return ;
  10. }
  11. int num = ; //需要返回的值
  12. int flag = ; //记录正负号
  13. if (*str == '-')
  14. {
  15. flag = -;
  16. str++;
  17. }
  18. else if (*str == '+')
  19. {
  20. str++;
  21. }
  22.  
  23. while (*str >= '' && *str <= '')
  24. {
  25. num= (num * + (*str - ''));
  26. str++;
  27. }
  28.  
  29. return num*flag;
  30. }
  31.  
  32. void main()
  33. {
  34. char str[] = "-57124";
  35. int num = ;
  36.  
  37. printf("%d\n",myatoi(str));
  38.  
  39. system("pause");
  40. }

7.memcpy:拷贝某段内存

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<memory.h>
  4. //下标法
  5. void * mymemcpybyindex(void * dest, const void * sor, size_t len)
  6. {
  7. if (dest == NULL || sor == NULL)
  8. {
  9. return NULL;
  10. }
  11. for (int i = ; i < len; i++)
  12. {
  13. ((char*)dest) = ((char*)sor);
  14. }
  15. return dest;
  16. }
  17. //指针法
  18. void * mymemcpybyaddr(void * dest, const void * sor, size_t len)
  19. {
  20. if (dest == NULL || sor == NULL)
  21. {
  22. return NULL;
  23. }
  24. char * pdest = dest;
  25. char * psor = sor;
  26. char * plast = (char * )sor + len;
  27. while (psor < plast)
  28. {
  29. *pdest++ = *psor++;
  30.  
  31. }
  32. return dest;
  33. }
  34.  
  35. void main()
  36. {
  37. char str[] = "fengcong is fucking too handsome";
  38. char * pstr = (char[]) { }; //在栈上开辟一段内存
  39.  
  40. //printf("%s\n", memcpy(pstr, str, 32));
  41. printf("%s\n", mymemcpybyaddr(pstr, str, ));
  42.  
  43. system("pause");
  44. }

8.memset:对指定内存每个字节赋某个值

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<memory.h>
  4.  
  5. //下标法
  6. void * mymemsetbyindex(void * dest, int val, size_t len)
  7. {
  8. if (dest == NULL)
  9. {
  10. return NULL;
  11. }
  12. if (len == )
  13. {
  14. return dest;
  15. }
  16. char * p = dest;
  17. for (int i = ; i < len; i++)
  18. {
  19. p = val;
  20. }
  21. return dest;
  22. }
  23.  
  24. //指针法
  25. void * mymemsetbyaddr(void * dest, int val, size_t len)
  26. {
  27. if (dest == NULL)
  28. {
  29. return NULL;
  30. }
  31. if (len == )
  32. {
  33. return dest;
  34. }
  35. char * p = dest;
  36. char * plast = p + len;
  37. while (p < plast)
  38. {
  39. *p++ = val;
  40. }
  41. return dest;
  42. }
  43.  
  44. void main()
  45. {
  46. char str[] = "fengcong is fucking too handsome";
  47. //printf("%s\n", memset(str, 65, 8));
  48. printf("%s\n", mymemsetbyaddr(str, , ));
  49. system("pause");
  50. }

9.memmove:和memcpy类似,但是memmove采用了中间空间,memcpy是直接拷贝

两者区别之处在于当拷贝地址重复的时候,结果不一样(比较代码可知)

  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #include<string.h>
  4.  
  5. char * myftoa(double db, char * str)
  6. {
  7. char * pstr = str;
  8. //先判断 符号位
  9. if (db < )
  10. {
  11. *pstr = '-';
  12. db *= -; //转为正数处理
  13. pstr++;
  14. }
  15. //整数部分
  16. int zhengshu = (int)db;
  17. int izhengshu = zhengshu; //牺牲于记录整数长度
  18. int wei = ; //整数部分至少一位
  19. while ((izhengshu /= ) != )
  20. {
  21. wei++;
  22. }
  23. pstr += wei - ;
  24. for (int i = ; i < wei; i++)
  25. {
  26. *pstr-- = zhengshu % + '';
  27. zhengshu /= ;
  28. }
  29. pstr += (wei+);
  30. *pstr = '.';
  31. pstr++;
  32. //小数部分
  33. double xiaoshu = db - (int)db;
  34. for (int i = ; i < ; i++)
  35. {
  36. *pstr++ = (int)(xiaoshu * ) + '';
  37. xiaoshu = xiaoshu * - (int)(xiaoshu * );
  38. }
  39. return str;
  40. }
  41.  
  42. void main()
  43. {
  44. double db = -2.11;
  45. char str[] = { };
  46. printf("%s\n", myftoa(db,str));
  47.  
  48. system("pause");
  49. }

10.memchr:某段内存中寻找某个值

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<memory.h>
  4.  
  5. void * mymemchar(void * buf, int val, size_t size)
  6. {
  7. if (buf == NULL)
  8. {
  9. return NULL;
  10. }
  11. char * p = buf;
  12. char plast = p + size;
  13. while (p < plast)
  14. {
  15. if (*p == val)
  16. {
  17. return p;
  18. }
  19. p++;
  20. }
  21. return NULL;
  22. }
  23.  
  24. void main()
  25. {
  26. char str[] = "fengcong is fucking too handsome";
  27. printf("%s\n", mymemchar(str, 'g', ));
  28.  
  29. system("pause");
  30. }

11.memccpy:内存拷贝,直到一个值结束

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<memory.h>
  4. //下标法
  5. void * mymemccpybyindex(void * dest, const void * sor,int val, size_t len)
  6. {
  7. if (dest == NULL || sor == NULL)
  8. {
  9. return NULL;
  10. }
  11. for (int i = ; i < len; i++)
  12. {
  13. if( (((char*)dest) = ((char*)sor)) == val)
  14. return dest;
  15. }
  16. return dest;
  17. }
  18. //指针法
  19. void * mymemccpybyaddr(void * dest, const void * sor,int val, size_t len)
  20. {
  21. if (dest == NULL || sor == NULL)
  22. {
  23. return NULL;
  24. }
  25. char * pdest = dest;
  26. char * psor = sor;
  27. char * plast = (char *)sor + len;
  28. while (psor < plast)
  29. {
  30. if ((*pdest++ = *psor++) == val)
  31. return dest;
  32.  
  33. }
  34. return dest;
  35. }
  36.  
  37. void main()
  38. {
  39. char str[] = "fengcong is fucking too handsome";
  40. char * pstr = (char[]) { }; //在栈上开辟一段内存
  41. //printf("%s\n", memccpy(pstr,str,'s',32));
  42. printf("%s\n", mymemccpybyaddr(pstr, str, 'f', ));
  43.  
  44. system("pause");
  45. }

12.memicmp:比较某段内存大小(一个字节一个字节比较,像strcmp)

注意:切不可用来比较整数,除非一字节整数,因为整数存储方式是高位高字节

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<memory.h>
  4.  
  5. int mymemicmpbyaddr(const void * buf1, const void * buf2, size_t size)
  6. {
  7. char * p1 = buf1;
  8. char * p2 = buf2;
  9. int i = ;
  10. while(*p1 == *p2 && i < size)
  11. {
  12. p1++;
  13. p2++;
  14. i++;
  15. }
  16. if (*p1 > *p2)
  17. {
  18. return ;
  19. }
  20. else if (*p1 < *p2)
  21. return -;
  22. else
  23. return ;
  24.  
  25. }
  26.  
  27. void main()
  28. {
  29. char str[] = "fengcong is fucking too handsome";
  30. char str1[] = "fengfeng is fucking too handsome";
  31.  
  32. printf("%d\n", mymemicmpbyaddr(str, str1, ));
  33. system("pause");
  34. }

C语言面试题分类->字符串处理的更多相关文章

  1. C语言面试题分类->指针

    有关指针的经典面试题 C语言为何如此长寿并实用?C++为什么有那么多精彩?指针可以说是C/C++中的灵魂所在,虽然早期中pascal也有指针,但是和C/C++比起来不是一个级别的.今天为大家深入浅出的 ...

  2. C语言面试题分类->宏定义

    1.写一个“标准”宏,这个宏输入两个参数并返回较小的一个 答:#define MIN(x, y) ((x)<(y)?(x):(y))//注意x,y要加括号,因为x,y如果有复合运算会出现问题. ...

  3. C语言面试题分类->回调

    本文主要讲解如果实现回调,特别是在封装接口的时候,回调显得特别重要,我们首先假设有两个程序员在写代码,A程序员写底层驱动接口,B程序员写上层应用程序,然而此时底层驱动接口A有一个数据d需要传输给B,此 ...

  4. C语言面试题分类->链表

    链表的创建,清空,插入,删除 typedef int (* __compfunc)(const void *, const void *); //Traverse list. Fast macro t ...

  5. C语言面试题分类->排序算法

    1.选择排序. 每次将最小的数,与剩余数做比较.找到更小的,做交换. 时间复杂度:O(n²) 空间复杂度:O(1) 优缺点:耗时但内存空间使用小. void selectSort(int *p,int ...

  6. C语言面试题分类->位运算

    1.不用临时变量交换两个整数. a = a ^ b; b = a ^ b; a = a ^ b; 2.实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如9的二进制是1001,则输出2. i ...

  7. 嵌入式开发—C语言面试题

    嵌入式开发—C语言面试题 源地址:http://blog.csdn.net/xdx2ct1314/article/details/7358929   1. 用预处理指令#define 声明一个常数,用 ...

  8. 12个有趣的C语言面试题

    摘要:12个C语言面试题,涉及指针.进程.运算.结构体.函数.内存,看看你能做出几个! 1.gets()函数 问:请找出下面代码里的问题: #include<stdio.h> int ma ...

  9. 转 C语言面试题大汇总

    转 C语言面试题大汇总,个人觉得还是比较全地!!! \主 题:   C语言面试题大汇总,个人觉得还是比较全地!!!  作 者:   free131 (白日?做梦!)   信 誉 值:   100    ...

随机推荐

  1. 从头开始学Maven【依赖范围】

    例如 <dependencies> <dependency> <groupId></groupId> <artifactId></ar ...

  2. Linux系统(虚拟机)安装禅道

    1.查看linux系统版本 uname -a 2.禅道下载:http://www.zentao.net/download.html,找到要下载的版本,点击进入各平台下载: 3.将下载好的安装包上传到l ...

  3. uni-app 引入本地iconfont的正确姿势以及阿里图标引入

    1.引入本地iconfont iconfont文件里面包含 iconfont.ttf.iconfont.css, 将 iconfont.tt64文件转位 base64.推荐转换工具地址:https:/ ...

  4. LoadRunner监控数据库服务

    一.LR监控SQL Server SQL Server自身提供的性能计数器指标有: 指标名称 指标描述 指标范围 指标单位 1.SQL Server中访问方法(Access Methods)对象包含的 ...

  5. 导出pip安装的所有放入一个文件中,并把通过这个安装所有的包

    导出pip安装的所有的包: pip freeze > piplist.txt 在新的环境中安装导出的包 pip install -r piplist.txt

  6. cxf webservice请求https

    本地java请求https接口,不需要添加证书: 只需要修改配置文件applicationContext-soap-client.xml: <beans xmlns="http://w ...

  7. lombok @Accessors用法

    @Accessors 翻译是存取器.通过该注解可以控制getter和setter方法的形式. fluent 若为true,则getter和setter方法的方法名都是属性名,且setter方法返回当前 ...

  8. PADS Layout VX.2.3 更改Logic符号,并更新到原理图

    操作系统:Windows 10 x64 工具1:PADS Layout VX.2.3 统一使用A3尺寸的原理图,如果Logic符号画得太大,就会占用过多的面积.如下图所示,电阻的两只引脚的跨度占用了4 ...

  9. echarts 自定义配置带单位的 tooltip 提示框方法 和 圆环数据 tooltip 过长超出屏幕

    -------tip1-------- 在 tooltip  里边配置:拼接字符串: tooltip : { trigger: 'axis', formatter:function(params) { ...

  10. 学习日志1 :java 三大框架 了解

    1.spring--------利用它的IOC和AOP来处理控制业务(负责对数据库的操作) https://blog.csdn.net/yu616568/article/details/7073997 ...