如何手动实现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;
}

运行结果:


慢慢去学着写,绝对让你笔试无压力!!!

目录
相关文章
|
29天前
|
安全 程序员 C语言
探索C语言库函数:字符串拷贝函数strcpy
探索C语言库函数:字符串拷贝函数strcpy
19 0
C4.
|
1月前
|
存储 程序员 C语言
C语言中如何通过指针引用字符串
C语言中如何通过指针引用字符串
C4.
14 0
|
1月前
|
存储 编译器 C语言
在C语言中的数组和字符串
在C语言中的数组和字符串
|
1月前
|
存储 Serverless C语言
C语言字符串长度居然可以这样轻松掌握,后悔现在才知道!
C语言字符串长度居然可以这样轻松掌握,后悔现在才知道!
|
1月前
|
存储 C语言
【绝绝子】C语言字符串拷贝,小白必看的科普教程!
【绝绝子】C语言字符串拷贝,小白必看的科普教程!
|
15天前
|
存储 C语言
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现1
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现
|
15天前
|
C语言
【C语言】第三回 关于字符串,语句和注释的使用2
【C语言】第三回 关于字符串,语句和注释的使用
|
29天前
|
安全 程序员 C语言
探索C语言库函数:字符串拷贝函数strcpy()
探索C语言库函数:字符串拷贝函数strcpy()
9 0
|
29天前
|
存储 C语言
C语言字符串
C语言字符串
17 0
C语言字符串
|
30天前
|
安全 Unix Linux
【C/C++ 字符串】探索C语言之字符串分割函数:strtok和strsep的区别
【C/C++ 字符串】探索C语言之字符串分割函数:strtok和strsep的区别
15 0