模拟实现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

c函数strcpy() ,strcat(),strcmp(), strlen(), strchr() ,strstr() 使用整理

1.strcpy() 功能:      字符串复制 头文件:   string.h 返回值类型:   char* C语言标准库函数strcpy,把从src地址开始且含有'\0'结...
  • bitlxlx
  • bitlxlx
  • 2016年07月26日 10:33
  • 1246

面试题之strcpy/strlen/strcat/strcmp的实现

阿里的电面要我用C/C++实现一个字符串拷贝的函数,虽然以前写过 strcpy 的函数实现,但时间过去很久了,再加上有点紧张,突然就措手不及了。最后写是写出来了,但没考虑异常的情况,面试官好像很不满意...
  • lisong694767315
  • lisong694767315
  • 2015年03月15日 16:33
  • 2813

strcat,strcpy,strcmp,strstr,memset,memcpy,strsep在内核中的实现

以下代码来自linux-2.6.38 1、strcat 在lib/string.c中实现。 1 /** 2 * strcat - Append one %NUL-term...
  • qiao_yihan
  • qiao_yihan
  • 2013年12月23日 09:42
  • 2037

C语言_编写说明strlen、strcpy、strcat、strcmp如何实现的

随便定义一个char类型字符串数组,此以char string[] = "iphone";为例。 实现strlen char string[] = "iphone";     int...
  • xiu619544553
  • xiu619544553
  • 2015年04月25日 15:57
  • 393

strcat,strcpy,strcmp,strlen函数原型及其写法

相信大家对这几个函数相当熟悉,但是能q
  • xyb890826
  • xyb890826
  • 2014年09月09日 22:27
  • 2069

模拟实现strcmp,strncmp,strstr,strcat,strncat,strcpy,strncpy,strlen ,memcpy,memmove等函数

1.模拟实现strlen函数 #include #include #include int my_strlen(const char *str)//循环 { int count  = 0; asser...
  • qq_35420908
  • qq_35420908
  • 2016年08月03日 22:08
  • 539

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

1.三种方式模拟实现strlen函数。 2.模拟实现strcpy 3.模拟实现strcat 4.模拟实现strcmp 5.模拟实现strstr 6.模拟实现memcpy 7.模...
  • aidoudoua
  • aidoudoua
  • 2017年11月15日 20:20
  • 45

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

C语言库函数实现练习1.模拟实现strcpystrcpy是字符串复制函数,把从src(源字符串指针)地址开始且含有’\0’结束符的字符串复制到以dest(目的字符串指针)开始的地址空间。 注意:在进...
  • aimee_1024
  • aimee_1024
  • 2017年12月18日 22:46
  • 47

C语言字符串常用操作函数-puts、gets、strcmp、strcpy、strcat、strlen

C语言字符串常用操作函数-puts、gets、strcmp、strcpy、strcat、strlen
  • yuner1029
  • yuner1029
  • 2015年11月01日 22:13
  • 766

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

模拟实现:strstrstrcpystrlenstrcatstrcmpmemcpymemmove================================1 strstr 字符串中查找子字符串c...
  • alick97
  • alick97
  • 2016年10月25日 14:00
  • 95
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:模拟实现strstr,strcpy,strlen,strcat,strcmp,memcpy,memmove
举报原因:
原因补充:

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