C语言实现常见字符串操作函数

c 专栏收录该内容
7 篇文章 0 订阅

常见字符串操作函数的实现

strlen()函数

  1. 函数声明原型:
	size_t strlen( const char *string );
  1. 函数功能:
    计算指定的字符串string的长度。
  2. strlen函数实现:
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>

size_t strlen(const char *string);
size_t my_strlen1(const char* string)
{
	assert(string);
	size_t count = 0;
	while (*string++)
	{
		count++;
	}
	return count;
}
size_t my_strlen2(const char* string)
{
	assert(string);
	if (*string == '\0')
		return 0;
	return 1 + my_strlen2(string + 1);
}
int main()
{
	char s[] = "abcdefg";
	printf("%d\n", my_strlen2(s));
	system("pause");
	return 0;
}

strcpy()函数

  1. 函数声明原型:
	char *strcpy( char *strDestination, const char *strSource );
  1. 函数功能:
    将参数src字符串拷贝至参数dest所指的地址。
  2. 函数实现:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

char* my_strcpy(char* dest, const char* src)
{
	assert(dest);
	assert(src);
	char* ptr = dest;
	while (*src)
	{
		*dest++ = *src++;
	}
	*dest = *src;
	return ptr;
}
int main()
{
	char s1[] = "abefg";
	char s2[] = "cdefg";
	printf("%s\n", my_strcpy(s1, s2));
	system("pause");
	return 0;
}

strcmp()函数

  1. 函数声明原型:
	int strcmp( const char *string1, const char *string2 );
  1. 函数功能:
    字符串比较。
  2. 函数实现:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

int strcmp(const char *string1, const char *string2);//库函数原型

int my_strcmp(const char* s1, const char* s2)
{
	assert(s1);
	assert(s2);
	char* e1 = s1;
	char* e2 = s2;
	while ((*e1 == *e2) && (*e1 != '\0') && (*e2 != '\0'))
	{
		e1++;
		e2++;
	}
	if (*e1 > *e2)
		return 1;
	else if (*e1 < *e2)
		return -1;
	if (*e1 == *e2 == '\0')
		return 0;
}
int main()
{
	char s1[] = "bcde";
	char s2[] = "cde";
	printf("%d\n", my_strcmp(s1, s2));
	system("pause");
	return 0;
}

strcat()函数

  1. 函数声明原型:
	char *strcat( char *strDestination, const char *strSource );
  1. 函数功能:
    字符串拼接函数。
  2. 函数实现:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

char* my_strcat(char* dest, const char* src)
{
	assert(dest);
	assert(src);
	char* ptr = dest;
	while (*dest != '\0')
	{
		dest++;
	}
	while (*dest++ = *src++);
	*dest = *src;
	return ptr;
}
int main()
{
	char s1[] = "abcdef";
	char s2[] = "bcd";
	printf("%s\n",my_strcat(s1, s2));
	system("pause");
	return 0;
}

strchr()函数

  1. 函数声明原型:
	char *strchr( const char *string, int c );
  1. 函数功能:
    在一个字符串中查找给定字符的第一个匹配之处。
  2. 函数实现:
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>

char* my_strchr(const char* dest, int c)
{
	assert(dest);
	char* ptr = dest;
	while (*ptr++ != c);
	if (*ptr != '\0')
		return --ptr;
	else
		return NULL;
}
int main()
{
	char s1[] = "abcdef";
	char c = 'n';
	printf("%s\n", my_strchr(s1, c));
	system("pause");
	return 0;
}

strstr()函数

  1. 函数声明原型:
 char *strstr( const char *string, const char *strCharSet );
  1. 函数功能:
    检索子串在字符串中首次出现的位置。
  2. 函数实现:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

char* my_strstr(char* dest, const char* src)
{
	assert(dest);
	assert(src);
	char* ptr1 = dest;
	char* ptr2 = NULL;
	while (*ptr1 != *src && *ptr1 != '\0')
	{
		ptr1++;
		ptr2 = ptr1;
	}
	while (*ptr1 == *src)
	{
		ptr1++;
		src++;
	}
	if (*src != '\0')
		return NULL;
	else
		return ptr2;
}
int main()
{

	char s1[] = "abcdefg";
	char s2[] = "mn";
	printf("%s\n", my_strstr(s1, s2));

	system("pause");
	return 0;
}

strncpy()函数

  1. 函数声明原型:
 char *strncpy( char *strDest, const char *strSource, size_t count );
  1. 函数功能:
    将字符串src前n个字符拷贝到字符串dest。
  2. 函数实现:
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>

char* my_strncpy(char* dest, const char* src, size_t count)
{
	assert(dest);
	assert(src);
	char* ptr = dest;
	while (count-- && *src != '\0')
	{
		*ptr++ = *src++;
	}
	if (*src == '\0')
		*ptr = '\0';
	return dest;
}
int main()
{
	char s1[] = "abcd";
	char s2[] = "efg";
	printf("%s\n", my_strncpy(s1, s2, 2));
	system("pause");
	return 0;
}

strncat()函数

  1. 函数声明原型:
 char *strncat( char *strDest, const char *strSource, size_t count );
  1. 函数功能:
    将n个字符追加到字符串的结尾。
  2. 函数实现:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

char* my_strncat(char* dest, const char* src, size_t count)
{
	assert(dest);
	assert(src);
	char* ptr = dest;
	while (*ptr++ != '\0');
	ptr--;
	while (count-- && *src != '\0')
	{
		*ptr = *src;
		ptr++;
		src++;
	}
	*ptr = '\0';
	return dest;
		
}
int main()
{
	char s1[] = "abcd";
	char s2[] = "efgh";
	printf("%s\n", my_strncat(s1, s2, 5));
	system("pause");
	return 0;
}

strncmp()函数

  1. 函数声明原型:
 int strncmp( const char *string1, const char *string2, size_t count );
  1. 函数功能:
    字符串前n个字符比较。
  2. 函数实现:
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>

int my_strncmp(const char* s1, const char* s2, size_t count)
{
	assert(s1);
	assert(s2);
	while ((count--) && (*s1 != '\0') && (*s2 != '\0'))
	{
		if (*s1 > *s2)
			return 1;
		if (*s1 < *s2)
			return -1;
		s1++; s2++;
	}
	if (*s1 != '\0')
		return 1;
	if (*s2 != '\0')
		return -1;
	return 0;
}
int main()
{
	char s1[] = "bcd";
	char s2[] = "bcdd";
	printf("%d\n", my_strncmp(s1, s2, 5));
	system("pause");
	return 0;
}

memcpy()函数

  1. 函数声明原型:
void * memcpy ( void * destination, const void * source,size_t num);
  1. 函数功能:
    从source的位置开始向后复制num个字节的数据到destination的内存位置。
  2. 函数实现:
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
void* my_memcpy(void* dest, const void* src, size_t count)
{
	assert(dest);
	assert(src);
	char* d = (char*)dest;
	char* s = (char*)src;
	while (count--)
	{
		*d = *s;
		d++;
		s++;
	}
	return dest;
}
int main()
{
	char s1[] = "abcdedfg";
	char s2[] = "def";
	printf("%s\n",(char*)my_memcpy(s1,s2));
	return 0;
}

memmove()函数

  1. 函数声明原型:
void* memmove(void* destination,const void* soucre,size_t num);
  1. 函数功能:
    从source的位置开始向后复制num个字节的数据到destination的内存位置。
    和memcpy的区别就是memmove函数处理的源内存块和目标内存块是可以重叠的;

  2. 函数实现:

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
void* my_memmove(void* dest, const void* src, size_t count)
{
	assert(dest);
	assert(src);
	//(1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝
	//(2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝
	//(3)当源内存的首地址小于目标内存的首地址时,实行反向拷贝
	char* _dest = (char*)dest;
	char* _src = (char*)src;
	if ( _dest > _src) // 从高地址到低地址拷贝
	{
		while (count--)
		{
			*(_dest + count) = *(_src + count);
		}
	}
	else //从低地址到高地址拷贝
	{
		while (count--)
		{
			*_dest = *_src;
			_dest++;
			_src++;
		}
	}
	return dest;
}
int main()
{
	char s1[] = "abcdedfg";
	char s2[] = "def";
	printf("%s\n",(char*)my_memmove(s1,s2));
	return 0;
}

assert()函数用法

转载assert()函数用法总结

希望博主的这篇文章可以帮到你,,加油!!!

  • 8
    点赞
  • 3
    评论
  • 52
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值