字符串的使用

字符串的三种表达形式:

char *ptr = "abcdfef" ;  //字符串常量,存放在常量区
char ptr[] = "abcd";//    strlen(ptr)-->5
char ptr[] = {'a','b','c','d','\n'};    //和第二个是一个意思
char ptr[] = {'a','b','c','d'};      strlen(ptr)------>随机值,因为没有\n; 
  • size_t strlen ( const char * str );
    字符串已经 ‘\0’ 作为结束标志,strlen是指字符串\0之前有多少个字符
int mystrlen(const char* src)   //方式1
{
	if (NULL == src)
		return 0;
	int cout = 0;
	while (*src)
	{
		cout++;
		src++;
	}
	return cout;

}
int mystrlen(const char* src)   //方式2
{
	const char* cur = src;
	if (src == NULL)
		return 0;
	while (*src)
	{
		src++;
	}
	return src - cur; 
}
  • char* strcat(char* des,const char* src)

将两个char类型连接。
char d[20]=“GoldenGlobal”; char *s=“View”; strcat(d,s);
结果放在d中
printf("%s",d);
输出 d 为 GoldenGlobalView (中间无空格)

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

	return ret;


}
  • int strcmp ( const char * str1, const char * str2 );
    标准规定:
    第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字
    第⼀个字符串等于第⼆个字符串,则返回0
    第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字
int  mystrcmp(const char* str1,const char* str2)
{
	if (str1 != NULL &&str2 != NULL)
	{
		while (*str1 && *str2)
		{
			if (*str1 > *str2)

			{
				return 1;
			}
			else if (*str1 < *str2)

			{
				return -1;
			}
			else
			{
				str1++;
				str2++;
			}
			  
		}
		if (*str1 == '\0' && *str2 == '\0')   //易错点,是判断谁先遇到\0,而不是谁先为空
			return 0;
		else if (*str1 == '\0'&& *str2 != '\0')
			return -1;
		else
			return 1;

		

	}
}
  • char* strcpy(char* des,const char* src)
char arr[100] = "abc";
   char* arr1 = "ab"
   strcpy(arr,arr1);  //拷贝完,arr是ab;以第二个字符串的\0为截止
char* mystrcpy(char* str1, const char* str2)    //停在原串的\n
{
	if (str1 != NULL && str2 != NULL)
	{
		char *pcur = str1;
		while (*str2)   
		{
			*pcur = *str2;
			pcur++;
			str2++;
		}
		return pcur;
	}
}

内存操作函数

strcpy和memcpy都是标准C库函数,它们有下面的特点。
strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。

已知strcpy函数的原型是:char* strcpy(char* dest, const char* src);
memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。

void * memcpy ( void * destination, const void * source, size_t num );
函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
这个函数在遇到 '\0' 的时候并不会停下来。
但是处理不了源地址和目标地址的重叠部分

-void* memcpy(char* des,const char* src,size_t num)

void * memcpy(void* des,const void* src,size_t num)
{
	char *ret =(char*) des;
	char *p = (char *)des;
	char *q = (char *)src;   //给定指针,按字节来一个一个拷贝
	while (num--)
	{
		*p = *q;
		p++, q++;
	}
	return ret;

}
  • void* memove(void* des,const void* src,size_t num) //处理内存重叠的问题
void* my_memove(void *dest, const void *src, int size) //解决内存重叠问题,即两块内存独立时可以任意拷贝,但两块内存重叠时就要分类拷贝

{
	char *ret = dest;
	char *p =(char*) dest;
	char *q = (char*)src;
	if ((q<p) && (q + size>p))  //从右向左拷
	{ 

		p = p + size - 1;
		q = q + size - 1;
		while (size--)
		{
			*p = *q;
			p--, q--;
		}

	}
	else                //其余情况都是从左向右拷
	{
		while (size--)
		{
			*p = *q;
			p++, q++;
		}
	}
	return  ret;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值