常见库函数的实现

本文探讨了库函数中的字符串拷贝操作,指出返回指针的目的是支持链式调用,例如strlen(strcpy(dst, src))。同时,强调在使用时确保目标字符串dst有足够的内存空间。此外,还提到了整数转化为字符串的转换过程。" 7312922,471242,时间戳策略在分布式系统中的应用,"['数据库', '分布式存储', '存储系统', '并行数据库']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字符串拷贝,返回指针是为了实现链式操作,如strlen(strcpy(dst, src)),des需要保证有足够空间

char* strcpy(char* des,const char* src)
{
	assert(des!=NULL && src!=NULL);
	char* temp = des;
	while((*des++  = *src++ )!='\0')
	    ;
	return temp;
}
复制字符串的前n个字符
char* strncpy(char* des,const char* src,size_t n)
{
	assert(des!=NULL && src!=NULL);
	char* temp =des;
	while(n-- && (*des++ = *src++) !='\0')
		;
	*des='\0';//必须加
	return temp;
}
字符串比较,p>q则返回整数,p=q返回0,否则返回负数
int strcmp(const char* p, const char* q)
{
	assert(p!=NULL && q!=NULL);
	while(*p && *q && *q==*p)
	{
		p++;
		q++;
	}
	return (*p - *q); 
}
拼接字符串,注意这里des需要保证有足够的空间
char* strcat(char* des,const char* src)
{
	assert(des!=NULL && src!=NULL);
	char* temp = des;
	while(*des != '\0')
		des++;
	while((*des++ = *src++) != '\0')
		;
	return temp;
}
查找字符串
const char* strstr(const char* str, const char* substr)
{
	assert(str!= NULL && substr != NULL);
	const char *p,*q,*res;
	while(*str!='\0')
	{
		p = str;
		q = substr;
		res = p;//保存位置

		while(*p ==*q && *p!='\0')
		{
			p++;
			q++;
		}
		if(*q == '\0')//字符串匹配
			return res;
		else
			str++;
	}
	return NULL;

}
src所指向的某一块内存中的前n个字节的内容全部设置为c对应的ASCII值
void* memset(void* src,int c,size_t n )
{
	assert(src!=NULL);
	void* temp =src;
	while(n--)
	{
		*(char*)src=(char)c;
		src=(char*)src+1;
	}
	return temp;
}
从源src所指的内存地址的起始位置开始拷贝n个字节到目标des所指的内存地址的起始位置中
void* memcpy(void* des,const void* src,size_t n)
{
	assert(des!=NULL && src!=NULL);
	
	void* temp = des;
	while(n--)
	{
		*(char*)des = *(char*)src;
        src=(char*)src+1;
		des=(char*)des+1;
	}
	return temp;
}
strcpy和memcpy主要有以下3方面的区别。
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy。

整数转为字符串

void itoa(int n, char *str)
{
	int j=0,k=0;
	char buf[100];
	if(n==0)
		str[k++]='0';
	else if(n>0) 
	{
		while(n)
		{
			buf[j++]=n%10+'0';
			n=n/10;
		}
	}
	else
	{
		n=-n;
        while(n)
		{
             buf[j++]=n%10+'0';
		     n=n/10;
        }
        buf[j++]='-';//负数时,需在末尾添加'-'
	}
	while(j--)
	{
	    str[k++]=buf[j];//由于整数逆序存储在buf[j]中,需重新保存
	}
    str[k]='\0';//不能省,否则崩溃
}
字符串转化为整数
int atoi(const char* str)
{
		const char* p =str;
		long num=0;//输入的数可能很大,防止溢出
		bool minus=false;
		if(*p=='-')//判断正负号
		{
			p++;
			minus=true;
		}
		if(*p=='+')
			p++;
		while(*p!='\0')
		{
			if(*p>='0' && *p<='9')//防止输入中有其他字符
			{
				num=num*10+(*p++ - '0');
			}
			else 
			{
				
				num = 0;
				break;
			}
	    }
		
		if(*p=='\0')
		{
			if(minus)
				num=0-num;
		}
		return num;
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值