C语言面试题分类->字符串处理
1.strlen:计算字符串长度(不包含'\0')
实现想法:遍历字符串,直到'\0'结束
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- //指针法
- unsigned int mystrlenaddr(const char * str) //为什么使用const char,我们只计数不对原数据进行改变
- {
- int length = ; //长度初始化为0
- while (*str++)
- {
- length++;
- }
- return length;
- }
- void main()
- {
- char * str = "fengcong is fucking too handsome"; //32个
- //printf("%d\n", strlen(str));
- printf("%d\n", mystrlenaddr(str));
- system("pause");
- }
2.strcmp:比较字符串大小(一般用于字符串排序)
实现想法:依次从字符串开始一直找到不同的那个字符进行比较,得出大小
- #include<string.h>
- #include<stdio.h>
- #include<stdlib.h>
- //掌握指针法
- int mystrcmp(char const * str1, const char * str2)
- {
- while (*str1 == *str2 && *str1 != '') //一直找到两个字符串不同的地方
- {
- str1++;
- str2++;
- }
- if (*str1 > *str2)
- return ;
- else if (*str1 < *str2)
- return -;
- else
- return ;
- }
- void main()
- {
- char * str = "feng1";
- char * str1 = "feng2";
- //printf("%d\n", strcmp(str, str1));
- printf("%d\n", mystrcmp(str, str1));
- system("pause");
- }
3.strcpy:用于字符串复制(复制包含'\0')
实现想法:一直复制到'\0'结束
- #define _CRT_SECURE_NO_WARNINGS
- #include<stdlib.h>
- #include<stdio.h>
- #include<string.h>
- //指针法
- char * mystrcpyaddr(char * dest, const char * source)
- {
- if (dest == NULL || source == NULL)
- {
- return NULL; //如果目的操作或者源为空,那么久直接返回
- }
- while (*dest++ = *source++) //装X写法
- ;
- return dest;
- }
- //下标法
- char * mystrcpyindex(char * dest, const char * source)
- {
- if (dest == NULL || source == NULL)
- {
- return NULL; //如果目的操作或者源为空,那么久直接返回
- }
- int i = ;
- while (source != '\0')
- {
- dest = source;
- i++;
- }
- dest = source; //因为要把最后的\0拷贝过去
- return dest;
- }
- void main()
- {
- char * str = "fengcong is fucking too handsome";
- char str1[]; //目的字符数组
- //strcpy(str1, str);
- //printf("%s\n", str1);
- mystrcpyindex(str1, str);
- printf("%s\n", str1);
- system("pause");
- }
4.strstr:寻找母串中是否存在某个子串(稍难)
实现想法:依次比对
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- //下标 法
- char * mystrstrindex(char * const momstr, const char * const sonstr)//前者指针指向的数据可变,但是指针不可变,后者都不可变
- {
- int momlen = strlen(momstr); //母串的长度
- int sonlen = strlen(sonstr); //子串的长度
- for (int i = ; i < (momlen - sonlen); i++) //从0开始循环母串,到momlen-sonlen停止
- {
- int flag = ;
- for (int j = ; j < sonlen; j++)
- {
- if (momstr[i + j] != sonstr[j])
- {
- flag = ;
- break; //如果出现不相等就 退出循环,继续从下面一个寻找
- }
- }
- if (flag)
- {
- return (&momstr);
- }
- }
- return NULL;
- }
- //指针法
- char * mystrstraddr(char * const momstr, const char * const sonstr)
- {
- char * mstr = momstr; //母串
- while (*mstr)
- {
- char * sstr = sonstr; //子串
- char * momnowstr = mstr; //记录现在母串的位置
- int flag = ;
- while (*sstr != )
- {
- if (*sstr != *momnowstr || *momnowstr == '')
- {
- flag = ;
- break;
- }
- momnowstr++;
- sstr++;
- }
- if (flag)
- {
- return mstr;
- }
- mstr++; //母串对比位置+1
- }
- return NULL;
- }
- void main()
- {
- char * str = "fengcong is too fucking handsome";
- //printf("%p", strstr(str, "fengcong"));
- //printf("%p", mystrstrindex(str, "engcong"));
- printf("%p", mystrstraddr(str, "some"));
- system("pause");
- }
5.itoa:整数转字符串
- #define _CRT_SECURE_NO_WARNINGS
- #include<stdlib.h>
- #include<stdio.h>
- #include<string.h>
- char * myitoa(int value, char * str)
- {
- char * pstr = str; //str本身不能改变,一会要返回str
- if (value < )
- {
- *pstr = '-';
- pstr++;
- value *= -; //转变为正数处理
- }
- int wei = ; //数至少一位
- int ivalue = value; //用于测试长度
- while ((ivalue /= ) != )
- {
- wei++;
- }
- pstr += wei-;
- while (value % != )
- {
- *pstr-- = (value % )+'';
- value /= ;
- }
- return str;
- }
- void main()
- {
- int num = -;
- char str[] = { };
- printf("%s", myitoa(num, str));
- system("pause");
- }
6.atoi:字符串转整数(遇到非数字字符结束)
- #include<stdlib.h>
- #include<stdio.h>
- #include<string.h>
- int myatoi(const char * str)
- {
- if (str == NULL)
- {
- return ;
- }
- int num = ; //需要返回的值
- int flag = ; //记录正负号
- if (*str == '-')
- {
- flag = -;
- str++;
- }
- else if (*str == '+')
- {
- str++;
- }
- while (*str >= '' && *str <= '')
- {
- num= (num * + (*str - ''));
- str++;
- }
- return num*flag;
- }
- void main()
- {
- char str[] = "-57124";
- int num = ;
- printf("%d\n",myatoi(str));
- system("pause");
- }
7.memcpy:拷贝某段内存
- #include<stdio.h>
- #include<stdlib.h>
- #include<memory.h>
- //下标法
- void * mymemcpybyindex(void * dest, const void * sor, size_t len)
- {
- if (dest == NULL || sor == NULL)
- {
- return NULL;
- }
- for (int i = ; i < len; i++)
- {
- ((char*)dest) = ((char*)sor);
- }
- return dest;
- }
- //指针法
- void * mymemcpybyaddr(void * dest, const void * sor, size_t len)
- {
- if (dest == NULL || sor == NULL)
- {
- return NULL;
- }
- char * pdest = dest;
- char * psor = sor;
- char * plast = (char * )sor + len;
- while (psor < plast)
- {
- *pdest++ = *psor++;
- }
- return dest;
- }
- void main()
- {
- char str[] = "fengcong is fucking too handsome";
- char * pstr = (char[]) { }; //在栈上开辟一段内存
- //printf("%s\n", memcpy(pstr, str, 32));
- printf("%s\n", mymemcpybyaddr(pstr, str, ));
- system("pause");
- }
8.memset:对指定内存每个字节赋某个值
- #include<stdio.h>
- #include<stdlib.h>
- #include<memory.h>
- //下标法
- void * mymemsetbyindex(void * dest, int val, size_t len)
- {
- if (dest == NULL)
- {
- return NULL;
- }
- if (len == )
- {
- return dest;
- }
- char * p = dest;
- for (int i = ; i < len; i++)
- {
- p = val;
- }
- return dest;
- }
- //指针法
- void * mymemsetbyaddr(void * dest, int val, size_t len)
- {
- if (dest == NULL)
- {
- return NULL;
- }
- if (len == )
- {
- return dest;
- }
- char * p = dest;
- char * plast = p + len;
- while (p < plast)
- {
- *p++ = val;
- }
- return dest;
- }
- void main()
- {
- char str[] = "fengcong is fucking too handsome";
- //printf("%s\n", memset(str, 65, 8));
- printf("%s\n", mymemsetbyaddr(str, , ));
- system("pause");
- }
9.memmove:和memcpy类似,但是memmove采用了中间空间,memcpy是直接拷贝
两者区别之处在于当拷贝地址重复的时候,结果不一样(比较代码可知)
- #include<stdlib.h>
- #include<stdio.h>
- #include<string.h>
- char * myftoa(double db, char * str)
- {
- char * pstr = str;
- //先判断 符号位
- if (db < )
- {
- *pstr = '-';
- db *= -; //转为正数处理
- pstr++;
- }
- //整数部分
- int zhengshu = (int)db;
- int izhengshu = zhengshu; //牺牲于记录整数长度
- int wei = ; //整数部分至少一位
- while ((izhengshu /= ) != )
- {
- wei++;
- }
- pstr += wei - ;
- for (int i = ; i < wei; i++)
- {
- *pstr-- = zhengshu % + '';
- zhengshu /= ;
- }
- pstr += (wei+);
- *pstr = '.';
- pstr++;
- //小数部分
- double xiaoshu = db - (int)db;
- for (int i = ; i < ; i++)
- {
- *pstr++ = (int)(xiaoshu * ) + '';
- xiaoshu = xiaoshu * - (int)(xiaoshu * );
- }
- return str;
- }
- void main()
- {
- double db = -2.11;
- char str[] = { };
- printf("%s\n", myftoa(db,str));
- system("pause");
- }
10.memchr:某段内存中寻找某个值
- #include<stdio.h>
- #include<stdlib.h>
- #include<memory.h>
- void * mymemchar(void * buf, int val, size_t size)
- {
- if (buf == NULL)
- {
- return NULL;
- }
- char * p = buf;
- char plast = p + size;
- while (p < plast)
- {
- if (*p == val)
- {
- return p;
- }
- p++;
- }
- return NULL;
- }
- void main()
- {
- char str[] = "fengcong is fucking too handsome";
- printf("%s\n", mymemchar(str, 'g', ));
- system("pause");
- }
11.memccpy:内存拷贝,直到一个值结束
- #include<stdio.h>
- #include<stdlib.h>
- #include<memory.h>
- //下标法
- void * mymemccpybyindex(void * dest, const void * sor,int val, size_t len)
- {
- if (dest == NULL || sor == NULL)
- {
- return NULL;
- }
- for (int i = ; i < len; i++)
- {
- if( (((char*)dest) = ((char*)sor)) == val)
- return dest;
- }
- return dest;
- }
- //指针法
- void * mymemccpybyaddr(void * dest, const void * sor,int val, size_t len)
- {
- if (dest == NULL || sor == NULL)
- {
- return NULL;
- }
- char * pdest = dest;
- char * psor = sor;
- char * plast = (char *)sor + len;
- while (psor < plast)
- {
- if ((*pdest++ = *psor++) == val)
- return dest;
- }
- return dest;
- }
- void main()
- {
- char str[] = "fengcong is fucking too handsome";
- char * pstr = (char[]) { }; //在栈上开辟一段内存
- //printf("%s\n", memccpy(pstr,str,'s',32));
- printf("%s\n", mymemccpybyaddr(pstr, str, 'f', ));
- system("pause");
- }
12.memicmp:比较某段内存大小(一个字节一个字节比较,像strcmp)
注意:切不可用来比较整数,除非一字节整数,因为整数存储方式是高位高字节
- #include<stdio.h>
- #include<stdlib.h>
- #include<memory.h>
- int mymemicmpbyaddr(const void * buf1, const void * buf2, size_t size)
- {
- char * p1 = buf1;
- char * p2 = buf2;
- int i = ;
- while(*p1 == *p2 && i < size)
- {
- p1++;
- p2++;
- i++;
- }
- if (*p1 > *p2)
- {
- return ;
- }
- else if (*p1 < *p2)
- return -;
- else
- return ;
- }
- void main()
- {
- char str[] = "fengcong is fucking too handsome";
- char str1[] = "fengfeng is fucking too handsome";
- printf("%d\n", mymemicmpbyaddr(str, str1, ));
- system("pause");
- }
C语言面试题分类->字符串处理的更多相关文章
- C语言面试题分类->指针
有关指针的经典面试题 C语言为何如此长寿并实用?C++为什么有那么多精彩?指针可以说是C/C++中的灵魂所在,虽然早期中pascal也有指针,但是和C/C++比起来不是一个级别的.今天为大家深入浅出的 ...
- C语言面试题分类->宏定义
1.写一个“标准”宏,这个宏输入两个参数并返回较小的一个 答:#define MIN(x, y) ((x)<(y)?(x):(y))//注意x,y要加括号,因为x,y如果有复合运算会出现问题. ...
- C语言面试题分类->回调
本文主要讲解如果实现回调,特别是在封装接口的时候,回调显得特别重要,我们首先假设有两个程序员在写代码,A程序员写底层驱动接口,B程序员写上层应用程序,然而此时底层驱动接口A有一个数据d需要传输给B,此 ...
- C语言面试题分类->链表
链表的创建,清空,插入,删除 typedef int (* __compfunc)(const void *, const void *); //Traverse list. Fast macro t ...
- C语言面试题分类->排序算法
1.选择排序. 每次将最小的数,与剩余数做比较.找到更小的,做交换. 时间复杂度:O(n²) 空间复杂度:O(1) 优缺点:耗时但内存空间使用小. void selectSort(int *p,int ...
- C语言面试题分类->位运算
1.不用临时变量交换两个整数. a = a ^ b; b = a ^ b; a = a ^ b; 2.实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如9的二进制是1001,则输出2. i ...
- 嵌入式开发—C语言面试题
嵌入式开发—C语言面试题 源地址:http://blog.csdn.net/xdx2ct1314/article/details/7358929 1. 用预处理指令#define 声明一个常数,用 ...
- 12个有趣的C语言面试题
摘要:12个C语言面试题,涉及指针.进程.运算.结构体.函数.内存,看看你能做出几个! 1.gets()函数 问:请找出下面代码里的问题: #include<stdio.h> int ma ...
- 转 C语言面试题大汇总
转 C语言面试题大汇总,个人觉得还是比较全地!!! \主 题: C语言面试题大汇总,个人觉得还是比较全地!!! 作 者: free131 (白日?做梦!) 信 誉 值: 100 ...
随机推荐
- 从头开始学Maven【依赖范围】
例如 <dependencies> <dependency> <groupId></groupId> <artifactId></ar ...
- Linux系统(虚拟机)安装禅道
1.查看linux系统版本 uname -a 2.禅道下载:http://www.zentao.net/download.html,找到要下载的版本,点击进入各平台下载: 3.将下载好的安装包上传到l ...
- uni-app 引入本地iconfont的正确姿势以及阿里图标引入
1.引入本地iconfont iconfont文件里面包含 iconfont.ttf.iconfont.css, 将 iconfont.tt64文件转位 base64.推荐转换工具地址:https:/ ...
- LoadRunner监控数据库服务
一.LR监控SQL Server SQL Server自身提供的性能计数器指标有: 指标名称 指标描述 指标范围 指标单位 1.SQL Server中访问方法(Access Methods)对象包含的 ...
- 导出pip安装的所有放入一个文件中,并把通过这个安装所有的包
导出pip安装的所有的包: pip freeze > piplist.txt 在新的环境中安装导出的包 pip install -r piplist.txt
- cxf webservice请求https
本地java请求https接口,不需要添加证书: 只需要修改配置文件applicationContext-soap-client.xml: <beans xmlns="http://w ...
- lombok @Accessors用法
@Accessors 翻译是存取器.通过该注解可以控制getter和setter方法的形式. fluent 若为true,则getter和setter方法的方法名都是属性名,且setter方法返回当前 ...
- PADS Layout VX.2.3 更改Logic符号,并更新到原理图
操作系统:Windows 10 x64 工具1:PADS Layout VX.2.3 统一使用A3尺寸的原理图,如果Logic符号画得太大,就会占用过多的面积.如下图所示,电阻的两只引脚的跨度占用了4 ...
- echarts 自定义配置带单位的 tooltip 提示框方法 和 圆环数据 tooltip 过长超出屏幕
-------tip1-------- 在 tooltip 里边配置:拼接字符串: tooltip : { trigger: 'axis', formatter:function(params) { ...
- 学习日志1 :java 三大框架 了解
1.spring--------利用它的IOC和AOP来处理控制业务(负责对数据库的操作) https://blog.csdn.net/yu616568/article/details/7073997 ...