学了字符串操作,很多人也许学了大概知道怎么用,但是太久没用就忘了,恰恰这是找软件工程师或者嵌入式工程师以及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语言中的字符串操作的更多相关文章

  1. C语言中返回字符串函数的四种实现方法 2015-05-17 15:00 23人阅读 评论(0) 收藏

    C语言中返回字符串函数的四种实现方法 分类: UNIX/LINUX C/C++ 2010-12-29 02:54 11954人阅读 评论(1) 收藏 举报 语言func存储 有四种方式: 1.使用堆空 ...

  2. C语言中返回字符串函数的四种实现方法

    转自C语言中返回字符串函数的四种实现方法 其实就是要返回一个有效的指针,尾部变量退出后就无效了. 有四种方式: 1.使用堆空间,返回申请的堆地址,注意释放 2.函数参数传递指针,返回该指针 3.返回函 ...

  3. C语言中格式字符串

    C语言中格式字符串的一般形式为: %[标志][输出最小宽度][.精度][长度]类型, 其中方括号[]中的项为可选项. 一.类型 我们用一定的字符用以表示输出数据的类型,其格式符和意义下表所示: 字符  ...

  4. C语言中求字符串的长度

    在C语言中求字符串的长度,可以使用sizeof()函数和strlen()函数,后者需要引入string.h (#include <string.h>) 因为C语言字符串是以 \0 结尾表示 ...

  5. C语言中以字符串形式输出枚举变量

    C语言中以字符串形式输出枚举变量 摘自:https://blog.csdn.net/haifeilang/article/details/41079255 2014年11月13日 15:17:20 h ...

  6. Java中的字符串操作(比较String,StringBuiler和StringBuffer)

    一.前言 刚开始学习Java时,作为只会C语言的小白,就为其中的字符串操作而感到震撼.相比之下,C语言在字节数组中保存一个结尾的\0去表示字符串,想实现字符串拼接,还需要调用strcpy库函数或者自己 ...

  7. SQL点滴33—SQL中的字符串操作

    原文:SQL点滴33-SQL中的字符串操作 计算字符串长度len()用来计算字符串的长度 select sname ,len(sname) from student 字符串转换为大.小写lower() ...

  8. Python中的字符串操作总结(Python3.6.1版本)

    Python中的字符串操作(Python3.6.1版本) (1)切片操作: str1="hello world!" str1[1:3] <=> 'el'(左闭右开:即是 ...

  9. Oracle中有关字符串操作的语法

    Oracle中有关字符串操作的语法 Oracle提供了丰富的字符串函数 lpad()函数 lpad()函数用于左补全字符串.在某些情况下,预期的字符串为固定长度,而且格式统一,此时可以考虑使用lpad ...

随机推荐

  1. springMVC源码分析--HttpRequestHandlerAdapter(四)

    上一篇博客springMVC源码分析--HandlerAdapter(一)中我们主要介绍了一下HandlerAdapter接口相关的内容,实现类及其在DispatcherServlet中执行的顺序,接 ...

  2. Nagle算法

    简介 Nagle算法是以他的发明人John Nagle的名字命名的,它用于自动连接许多的小缓冲器消息:这一过程(称为nagling)通过减少必须发送包的个数来增加网络软件系统的效率.Nagle算法于1 ...

  3. 开源框架Volley的使用《一》

    转载本专栏每一篇博客请注明转载出处地址,尊重原创.此博客转载链接地址:小杨的博客 http://blog.csdn.net/qq_32059827/article/details/52785378 本 ...

  4. shell-----sed命令详解

    Table of Contents 1. Sed简介  2. 定址  3. Sed命令  4. 选项  5. 元字符集  6. 实例  7. 脚本 1. Sed简介 sed是一种在线编辑器,它一次处理 ...

  5. Linux Debugging(八): core真的那么难以追踪吗?

    本周遇到了好几个core都很有典型性.在这里和大家分享下. 相信有过Linux编程经验的人,肯定都遇到过.感觉周围人很多对core有天然的恐惧感,尤其对刚入行不久的同学来说.当然了,也有工作好几年看到 ...

  6. 贪婪算法(Greedy algorithm)-算法学习之旅(一)

    我研一下学期选修了网络管理,因为是限选课所以我没有认真上课,今天因为快结课考试了,我才去,然后我发现了一个大秘密...... 原来老师从第三节课已经开始讲算法导论的知识了,我是不是错过了什么... 废 ...

  7. 02_MyBatis项目结构,所需jar包,ehcache.xml配置,log4j.properties,sqlMapConfig.xml配置,SqlMapGenerator.xml配置

     项目结构(所需jar包,配置文件) sqlMapConfig.xml的配置内容如下: <?xmlversion="1.0"encoding="UTF-8&qu ...

  8. SDL2源代码分析1:初始化(SDL_Init())

    ===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDL_Init()) SDL ...

  9. 通过一个工具类更深入理解动态代理和Threadlocal

    动态代理和Threadlocal 一个代理类返回指定的接口,将方法调用指定的调用处理程序的代理类的实例.返回的是一个代理类,由指定的类装载器的定义和实现指定接口指定代理实例调用处理程序最近用到一个工具 ...

  10. Mybatis执行SimpleExecutor(三)

    SimpleExecutor通过类名可以看出,它是一个简单的执行类,并不会做一些处理就执行sql,源码及分析如下: /** * @author Clinton Begin */ public clas ...