字符串函数和内存函数的实现

strlen

size_t strlen ( const char* str );

1.strlen是用来求字符串长度的函数,传给函数字符串开始字符的地址,函数逐个计数直到遇到字符串结尾标志服’\0’结束
2.函数的返回值是size_t,是无符号的
以下是该函数的模拟:

int my_strlen(const char * str)
{
 int count = 0;
 while(*str)
 {
  count++;
  str++;
 }
 return count;
}

strcpy和strncpy

strcpy:

char* strcpy ( char* destination, const char* source );

1.原字符串必须以’\0’结束,会将原字符串的’\0’拷贝到目标空间
2.目标空间必须足够大而且要可变
以下是该函数的实现:

char *my_strcpy(char *dest, const char*src)
{ 
 char *ret = dest;
 assert(dest != NULL);
 assert(src != NULL);
 
 while((*dest++ = *src++))
 {
  ;
 }
 return ret;
}

strncpy:

char* strncpy ( char* destination, const char* source, size_t num );

1.从源字符串拷贝n个字符到目标空间
2.如果源字符串长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个

strcat和strncat

strcat:

char * strcat ( char * destination, const char * source );

1.源字符串必须以 ‘\0’ 结束
2.目标空间必须足够大而且可修改
3.不能自己给自己追加
以下是该函数的实现:

char *my_strcat(char *dest, const char*src)
{
 char *ret = dest;
 assert(dest != NULL);
 assert(src != NULL);
 while(*dest)
 {
  dest++;
 }
 while((*dest++ = *src++))
 {
  ;
 }
 return ret;
}

strncat:

char * strncat ( char * destination, const char * source, size_t num );

1.从源字符串连接n个字符到目标空间
2.从目标字符串的第一个’\0’后面追加源字符串的n个字符

strcmp和strncmp

strcmp:

int strcmp ( const char * str1, const char * str2 );

1.第一个字符串小于与第二个字符串的不匹配值时,返回小于0的整数
2.第一个字符串等于与第二个字符串的不匹配值时,返回0
3.第一个字符串大于与第二个字符串的不匹配值时,返回大于0的整数
以下是该函数的实现:

int my_strcmp(const char* str1, const char* str2)
{
while (*str1 == *str2)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
return *str1 - *str2;
}

strncmp:

int strncmp ( const char * str1, const char * str2, size_t num );

比较两字符串的前n个字符

strstr

char * strstr ( const char *str1, const char * str2);

如果第二个字符串是第一个字符串的子串,函数则返回该子串在第一个字符串出现位置首字符的地址,如果不是,则返回空指针
以下是该函数的实现:

const char* my_strstr(const char* str1, const char* str2)
{
char* p = str1;
while (*p)
{
char* s1 = p;
char* s2 = str2;
while (*s1++ == *s2++)
{
if (*s2 == '\0')
return p;
}
p++;
}
return NULL;
}

strtok

char * strtok ( char * str, const char * sep );

1.sep参数是个字符串,定义了用作分隔符的字符集合
2.第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记
3.strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容
并且可修改。)
4.strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置
5.如果字符串中不存在更多的标记,则返回 NULL 指针

strerror

char * strerror ( int errnum );

#include <errno.h>//必须包含的头文件
返回错误码,所对应的错误信息。

memcpy

void * memcpy ( void * destination, const void * source, size_t num );

1.函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置
2.这个函数在遇到 ‘\0’ 的时候并不会停下来
3.如果source和destination有任何的重叠,复制的结果都是未定义的
以下是该函数的实现:

void* my_memcpy(const void* des, const void* src, size_t num)
{
int i = 0;
for (; i < num; i++)
{
*(((char*)des)++) = *(((char*)src)++);
}
}

memcmp

int memcmp ( const void * ptr1,
			 const void * ptr2,
			 size_t num );

比较从ptr1和ptr2指针开始的num个字节
在小端存储(如vs)中造成了65536比256小的情况

memmove

void * memmove ( void * destination, const void * source, size_t num );

1.和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的
2.如果源空间和目标空间出现重叠,就得使用memmove函数处理
以下是该函数的实现:

void* my_memmove(void* des, const void* src, size_t num)
{
	void* tmp = des;
	assert(des && src);
	if (des < src)
	{
		int i = 0;
		for (; i < num; i++)
		{
			*(((char*)des)++) = *(((char*)src)++);
		}
	}
	else
	{
		while (num--)
		{
			*((char*)des + num) = *((char*)src + num);
		}
	}
	return des;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值