模拟实现strstr,strcpy,strlen,strcat,strcmp,memcpy,memmove

原创 2016年06月02日 10:45:14

1,模拟实现strstr

strstr为字符串查找函数,其原型为:

char *strstr( const char *string, const char *strCharSet );

这个函数就是在string中寻找是否含有子字符串strCharSet,寻找过程两个都不需要发生改变,所以将它们声明为const常量。返回值为char *这样可以方便链式访问。代码实现如下:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char *my_strstr(const char *dest,const char *src)
{
	assert(dest);
	assert(src);
	char *p1 = NULL;
	char *p2 = NULL;
	char *ptr = dest;
	while(*ptr)
	{
		p1 = ptr;
		p2 = src;
		while (*p1 == *p2)
		{
			p1++;
			p2++;
			if (*p2 == '\0')
			{
				return ptr;
			}
		}
		ptr++;
	}
	return NULL;
}
int main()
{
    char arr[20] = "abcdefg";
	char *p = "def";
	char *ret = my_strstr(arr, p);
	if (ret != NULL)
	{
		printf("%p\n", ret);
		printf("%s\n", ret);
	}
	else
	{
		printf("not exist\n");
	}
	system("pause");
	return 0;
}

2,模拟实现strcpy

strcpy是字符串拷贝函数,其原型为:

char *strcpy( char *strDestination, const char *strSource );

这个函数就是将strSource中的字符串拷贝到strDestination中,strSource不会发生改变,所以用const加以修饰。代码实现如下:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char *my_strcpy(char *dest, const char *src)
{
	assert(dest);
	assert(src);
	char *ret = dest;
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr[20] = "abcde";
	char *p = "xyzw";
	char *ch=my_strcpy(arr, p);
	printf("%s\n", ch);
	system("pause");
	return 0;
}

3,模拟实现strlen

strlen是求取字符串长度的函数,其原型为:

size_t strlen( const char *string );

size_t其实就是无符号整型。string不需要修改,所以应用const保护起来。代码实现如下:

(1)计数器

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
int my_strlen(char *str)
{
	assert(str);
	int count = 0;
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	char arr[] = "abcdefghi";
	int len=my_strlen(arr);
	printf("%d\n", len);
	system("pause");
	return 0;
}

(2)递归

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
int my_strlen(const char *str)
{
	assert(str);
	if (*str)
	{
		return 1 + my_strlen(str + 1);
	}
	return 0;
}
int main()
{
	char arr[] = "abcdefghi";
	int len=my_strlen(arr);
	printf("%d\n", len);
	system("pause");
	return 0;
}

(3)指针减指针

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
int my_strlen(const char *str)
{
	assert(str);
	const char *p = str;//为了防止通过p修改了str,所以将p设为常量指针
	while (*str)
	{
		str++;
	}
	return str - p;//指针减指针
}
int main()
{
	char arr[] = "abcdefghi";
	int len=my_strlen(arr);
	printf("%d\n", len);
	system("pause");
	return 0;
}

4,模拟实现strcat

strcat是字符串追加函数,其原型为:

char *strcat( char *strDestination, const char *strSource );

就是将字符串strSource追加在字符串strDestination后面,代码 实现如下:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char *my_strcat(char *dest, const char *src)
{
	assert(dest);
	assert(src);
	char *ret = dest;
	while (*dest)
	{
		dest++;
	}
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr[20] = "abcd";
	char *p = "efgh";
	char *ch=my_strcat(arr, p);
	printf("%s\n", ch);
	system("pause");
	return 0;
}

5,模拟实现strcmp

strcmp是字符串比较函数,它的原型为:

int strcmp( const char *string1, const char *string2 );

按位比较字符串中每个字符的ASCII码值。如果string1大于string2,则返回1,如果小于则返回-1,相等返回0。代码实现如下:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
int my_strcmp(const char *dest, const char *src)
{
	assert(dest);
	assert(src);
	while (*dest == *src)
	{
		if (*dest =='\0')
		{
			return 0;
		}
		dest++;
		src++;
	}
	return *dest - *src;
}
int main()
{
	const char *p1 = "abcdef";
	const char *p2 = "aef";
	int ret = my_strcmp(p1, p2);
	if (ret == 0)
	{
		printf("p1==p2\n");
	}
	else if (ret >0)
	{
		printf("p1>p2\n");
	}
	else
	{
		printf("p1<p2\n");
	}
	system("pause");
	return 0;

6,模拟实现memcpy

memcpy是内存拷贝函数,它的原型是:

void *memcpy( void *dest, const void *src, size_t count );

它从源src所指的内存空间的起始位置开始拷贝count个字节到目标dest所指的内存地址的起始位置中,函数返回指向dest的指针。src和dest不一定是数组,任意可读写的空间都可以。代码实现如下:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void *my_memcpy(void *buf1, const void *buf2, int count)
{
	assert(buf1);
	assert(buf2);
	void *ret = buf1;
	char *dest = (char *)buf1;
	char *src = (char *)buf2;
	char *ptr = dest;
	while (count--)
	{
		*dest++ = *src++;
	}
	return buf1;
}
int main()
{
	char arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
	char arr2[10] = { 0 };
	int i = 0;
    my_memcpy(arr1, arr2, 10);
	for (i = 0; i < 10; i++)
	{
		printf("%d\n", arr1[i]);
	}
	system("pause");
	return 0;
}

注意:

src和dest所指的内存区域有可能重叠,但是memcpy不能保证src所在重叠区域在拷贝之前不被覆盖。使用memmove可以解决这个问题。

7,模拟实现memmove

memmove也是内存拷贝函数,它的原型是:

void *memmove( void *dest, const void *src, size_t count );

由str复制count个字节到dest中,,如果目标区域和源区域有重叠的部分,memmove能够保证src在被覆盖之前将重叠部分的字节拷贝到dest中。代码实现如下:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void *my_memmove(void *buf1, const void *buf2, int count)
{
	assert(buf1);
	assert(buf2);
	void *ret = buf1;
	char *dest = (char *)buf1;
	char *src = (char *)buf2;
	if ((dest > src) && (dest < src + count))
	{
		while (count--)
		{
			*(dest+count) = *(src+count);
		}
	}
	else
	{
		while (count--)
		{
			*dest++ = *src++;
		}
	}
	return ret;
}
int main()
{
	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
	my_memmove(arr + 5, arr + 2, 12);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d\n", arr[i]);
	}
	system("pause");
	return 0;
}


本文出自 “Stand out or Get out” 博客,请务必保留此出处http://jiazhenzhen.blog.51cto.com/10781724/1718721

模拟实现字符串操作函数(strcpy,strstr,strcat,strcmp,strlen)与内存操作函数(memcpy,memmove)

一、字符串操作         strcpy(str1,str2) 复制字符串         strcat(str1,str2) 附加字符串         strlen(str) 取字符串长度 ...

strlen函数 strcpy函数 strcmp函数 strstr函数 strcat函数 memcpy函数 memmove函数 以及字符串反转函数的实现

//编写一个函数计算一个字符串的长度 #include #include //int my_strlen(char *str) //{ // int len = 0; // whi...

模拟实现C库函数strcpy,strcat,strstr,strchr,strcmp,memcpy,memmove

1、模拟实现strcpy char *my_strcpy( char *dest, const char *str) { assert(dest != NULL); assert(str != N...

模拟实现函数库中的各种常用函数,1实现strcpy 2.实现strcat 3.实现strstr 4.实现strchr 5.实现strcmp 6.实现memcpy 7.实现memmove

————– 1模拟实现strcpy—————strcpy函数是将源字符串复制到目标字符串的函数strcpy函数的思路就是,它是一个字符串,有\0作为结束标志,那么可以用\0作为突破点和条件,具体代码如...

mem系列函数(memset memcpy memmove) 和str系列函数(strlen strcpy strcmp strcat strstr strtok)

void *memset(void *s, int ch, size_t n);  函数解释:将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s ...

memcmp,memcpy,memmove,memset,strcat,strcmp,strcpy,strlen 8个函数的实现

为区别库函数,函数名首字母大写。 Memcmp函数: //内存区域内容比较函数 int Memcmp(const void *buf1,const void *buf2,unsigne...

c语言中字符串函数strlen()、strcat()、strcpy()、strcmp()及内存操作函数memset()、memcpy()、memcmp()、memmove()的使用及编码实现

c语言中字符串函数strlen()、strcat()、strcpy()、strcmp()及内存操作函数memset()、memcpy()、memcmp()、memmove()的使用及编码实现 str...

strcpy strlen memcpy strcat strcmp strstr strrev函数的实现代码

/* //strcpy函数的实现,注意命名要与原来的库函数有区别 #include #include #include using namespace std; char *mystrcp...
  • yzl_rex
  • yzl_rex
  • 2012年07月24日 10:53
  • 1112

模拟实现//strcpy //strncpy //strcat //strncat //strcmp //strncmp //memcpy //memmove

//strcpy//strncpy//strcat//strncat//strcmp//strncmp//memcpy//memmove以上函数都是库函数,现在我来模拟实现他们的功能,其他的也不多说了...

模拟实现strlen,strcpy,strcmp,strcat,strstr库函数

模拟实现strlen库函数 功能:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符'\0'。返回的长...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:模拟实现strstr,strcpy,strlen,strcat,strcmp,memcpy,memmove
举报原因:
原因补充:

(最多只允许输入30个字)