如何手动实现C语言中的字符串操作
学了字符串操作,很多人也许学了大概知道怎么用,但是太久没用就忘了,恰恰这是找软件工程师或者嵌入式工程师以及C,C++相关的笔试面试必考的题目!接下来我们来看看如何手动实现这些相关的函数。
废话不多说,直接上代码:
#include<stdio.h> #include <stdlib.h> //字符串拷贝 char * strcpy(char * dest,const char *src) ; char * strncpy(char * dest,const char *src,size_t count) ; //字符串黏贴 char * strcat(char * dest, const char * src) ; char * strncat(char *dest, const char *src, size_t count) ; //字符串比较 int strcmp(const char * cs,const char * ct) ; //字符串查找 char * strchr(const char * s, int c) ; char * strrchr(const char * s, int c); //计算字符串有多少个字节 int strlen(const char * s); //将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。 void * memset(void * s,int c,size_t count) ; //内存拷贝函数 void * memcpy(void * dest,const void *src,size_t count); //由src所指内存区域复制count个字节到dest所指内存区域。 void * memmove(void * dest,const void *src,size_t count) ; //比较内存区域buf1和buf2的前count个字节。该函数是按字节比较的。 int memcmp(const void * cs,const void * ct,size_t count); int main(void) { //定义一个字符串 char *str = "Hello world!"; char *str1 = "hello world!"; char *str2 = "yangyuanxin"; char buffer[256]; //将数组的256块存储区域清空 memset(buffer , 0 ,256) ; //将字符串str拷贝到buffer这个数组空间里去 strcpy(buffer , str); printf("buffer:\n%s\n",buffer); //比较字符串str与str1是否相同 if(strcmp(str,str1) == 0){ printf("字符串比较相同!\n"); }else{ printf("字符串比较不同\n"); } //将str1黏贴到buffer这个字符串的后面 strcat(buffer , str1); printf("buffer:\n%s\n",buffer); //计算字符串的大小 printf("len:%d %d %d\n",strlen(str1),strlen(str),strlen(buffer)); //从前往后查找 printf("%s\n",strchr(str1 ,'o')); //从后往前查找 printf("%s\n",strrchr(str1 ,'d')); //由str2所指内存区域复制11个字节到buffer所指内存区域。 memmove(buffer , str2 , 11) ; printf("%s\n",buffer); //拷贝,跟memmove差不多的 memcpy(buffer , str1 ,11); printf("%s\n",buffer); //内存比较 if(memcmp(buffer , str2 ,11) == 0){ printf("内存区域相同!\n"); }else{ printf("内存区域不同!\n"); } return 0 ; } char * strcpy(char * dest,const char *src) { char *tmp = dest; while ((*dest++ = *src++) != '\0') //判断拷贝有没有到伪0 /* nothing */; return tmp; } char * strncpy(char * dest,const char *src,size_t count) { char *tmp = dest; while (count) { //count指的是要拷贝多少个字节 if ((*tmp = *src) != 0) src++; tmp++; count--; } return dest; } char * strcat(char * dest, const char * src) { char *tmp = dest; while (*dest) dest++; while ((*dest++ = *src++) != '\0') //将src这个字符串黏贴到dest这个字符串的后面去 ; return tmp; } char * strncat(char *dest, const char *src, size_t count) { char *tmp = dest; if (count) { //要黏贴多少个字节,这个接口比上面那个灵活 while (*dest) dest++; while ((*dest++ = *src++) != 0) { if (--count == 0) { *dest = '\0'; break; } } } return tmp; } int strcmp(const char * cs,const char * ct) { register signed char __res; while (1) { if ((__res = *cs - *ct++) != 0 || !*cs++) //字符串比较 break; } return __res; } char * strchr(const char * s, int c) { for(; *s != (char) c; ++s) //从前往后查找字符串中有没有存在的字符 if (*s == '\0') return NULL; return (char *) s; } char * strrchr(const char * s, int c) { const char *p = s + strlen(s); <span style="font-family: Arial, Helvetica, sans-serif;"> </span> do { //从后往前查找 if (*p == (char)c) return (char *)p; } while (--p >= s); return NULL; } int strlen(const char * s) { const char *sc; for (sc = s; *sc != '\0'; ++sc) //计算字符串中有多少个字节 /* nothing */; return sc - s; }
//清楚内存区域 void * memset(void * s,int c,size_t count) { char *xs = (char *) s; while (count--) *xs++ = c; return s; } //内存区域的拷贝 void * memcpy(void * dest,const void *src,size_t count) { char *tmp = (char *) dest, *s = (char *) src; while (count--) *tmp++ = *s++; return dest; } //类似上面那个 void * memmove(void * dest,const void *src,size_t count) { char *tmp, *s; if (dest <= src) { tmp = (char *) dest; s = (char *) src; while (count--) *tmp++ = *s++; } else { tmp = (char *) dest + count; s = (char *) src + count; while (count--) *--tmp = *--s; } return dest; } //内存区域比较,有点类似strcmp int memcmp(const void * cs,const void * ct,size_t count) { const unsigned char *su1, *su2; int res = 0; for( su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--) if ((res = *su1 - *su2) != 0) break; return res; }
运行结果:
慢慢去学着写,绝对让你笔试无压力!!!
如何手动实现C语言中的字符串操作的更多相关文章
- C语言中返回字符串函数的四种实现方法 2015-05-17 15:00 23人阅读 评论(0) 收藏
C语言中返回字符串函数的四种实现方法 分类: UNIX/LINUX C/C++ 2010-12-29 02:54 11954人阅读 评论(1) 收藏 举报 语言func存储 有四种方式: 1.使用堆空 ...
- C语言中返回字符串函数的四种实现方法
转自C语言中返回字符串函数的四种实现方法 其实就是要返回一个有效的指针,尾部变量退出后就无效了. 有四种方式: 1.使用堆空间,返回申请的堆地址,注意释放 2.函数参数传递指针,返回该指针 3.返回函 ...
- C语言中格式字符串
C语言中格式字符串的一般形式为: %[标志][输出最小宽度][.精度][长度]类型, 其中方括号[]中的项为可选项. 一.类型 我们用一定的字符用以表示输出数据的类型,其格式符和意义下表所示: 字符 ...
- C语言中求字符串的长度
在C语言中求字符串的长度,可以使用sizeof()函数和strlen()函数,后者需要引入string.h (#include <string.h>) 因为C语言字符串是以 \0 结尾表示 ...
- C语言中以字符串形式输出枚举变量
C语言中以字符串形式输出枚举变量 摘自:https://blog.csdn.net/haifeilang/article/details/41079255 2014年11月13日 15:17:20 h ...
- Java中的字符串操作(比较String,StringBuiler和StringBuffer)
一.前言 刚开始学习Java时,作为只会C语言的小白,就为其中的字符串操作而感到震撼.相比之下,C语言在字节数组中保存一个结尾的\0去表示字符串,想实现字符串拼接,还需要调用strcpy库函数或者自己 ...
- SQL点滴33—SQL中的字符串操作
原文:SQL点滴33-SQL中的字符串操作 计算字符串长度len()用来计算字符串的长度 select sname ,len(sname) from student 字符串转换为大.小写lower() ...
- Python中的字符串操作总结(Python3.6.1版本)
Python中的字符串操作(Python3.6.1版本) (1)切片操作: str1="hello world!" str1[1:3] <=> 'el'(左闭右开:即是 ...
- Oracle中有关字符串操作的语法
Oracle中有关字符串操作的语法 Oracle提供了丰富的字符串函数 lpad()函数 lpad()函数用于左补全字符串.在某些情况下,预期的字符串为固定长度,而且格式统一,此时可以考虑使用lpad ...
随机推荐
- Objective-C语法概述
Objective-C语法概述 简称OC 面向对象的C语言 完全兼容C语言 可以在OC里面混入C/C++代码 可以开发IOS和Mac OS X平台应用 语法预览 关键字 基本上都是以@开头(为了与C语 ...
- Android自定义控件及自定义属性
Android自定义控件及自定义属性 自定义控件 创建自定义控件 自定义一个类,继承View 继承View还是哪个类,取决于你要实现一个什么样的控件 如果你要实现的是一个线性布局的组合控件,就可以继承 ...
- SpriteKit关于SKScene中的渲染Loop
在本节中,我将来说明一下SKScene在SKView显示之后发生了神马. 在更传统的iOS app中,你可能只会渲染view的内容仅仅一次,然后它将保持静态直到view的模式发生了显示的改变,这对于商 ...
- 反射模拟DbUtils实现ResultSet转成Bean实例
前几天接触到了apache的一个小框架DbUtils,真的被其优雅的设计所震撼到了,尤其是其中的 MyBean mybean = QueryRunner.query(sqlConnection,sql ...
- Android开发 无法导入ViewPagerIndicator或其他开源框架无法导入
这个问题又花费了好长时间,其实就是很简单的问题,因为各种开源框架的库名称都叫liberary,如果上次导入其他开源框架没有更改名称的话,你再导入其他第三库的时候,系统发现重名,就提示无法导入现象. 解 ...
- Swift中实现ruby中字符串乘法倍增的功能
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们知道在ruby中对于字符串类型我们可以用乘法生成一个指定数 ...
- iOS设计指南
备忘:iOS设计指南:http://www.ui.cn/detail/32167.html
- (NO.00005)iOS实现炸弹人游戏(十):游戏主角(三)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 下面我们来看游戏主角类里面几个播放特殊动画的方法,首先从run ...
- Xcode7 真机免证书调试Cocos2D游戏
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 经过一番实验,现在终于可以在Xcode7上免证书真机调试了: ...
- 【一天一道LeetCode】#206. Reverse Linked List
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Reverse ...