字符串操作函数

头文件:mystring.h

#ifndef __MYSTRING_H__
#define __MYSTRING_H__

#include<stdio.h>

int myStrlen(const char *a);

char *myStrcpy(char *a,const char *b);
char *myStrncpy(char *a,const char *b,int n);

char *myStrcat(char *a,const char *b);
char *myStrncat(char *a,const char *b,int n);

int myStrcmp(const char *a,const char *b);
int myStrncmp(const char *a,const char *b,int n);


#endif
string.cpp:(改良前)

int myStrlen(const char *a)
{
	int n = 0;
	while(*a != '\0')
	{
		n++;
		a++;
	}
	return n;
}
char *myStrcpy(char *a,const char *b)
{
	char *ret = a;//函数的返回值是数组a的首地址,下面的操作使得a不再是数组的首地址,所以首先将首地址先保存下来

	while(*b != '\0')
	{
		*a = *b;
		a++;
		b++;
	}
	*a = '\0';    //while循环未将b的“\0”拷贝进去
	return ret;
}
char *myStrncpy(char *a,const char *b,int n)
{
	char *ret = a;
	while(*b != '\0' && n != 0)
	{
		*a = *b;
		a++;
		b++;
		n--;
	}
	return ret;
}
char *myStrcat(char *a,const char *b)
{
	char *ret = a;
	while(*a != '\0')//从数组的末尾处连接(即\0处),所以首先将a指向数组的末尾\0处
	{
		a++;
	}
	while(*b != '\0')
	{
		*a = *b;
		a++;
		b++;
	}
	*a = '\0';
	return ret;
}
char *myStrncat(char *a,const char *b,int n)
{
	char *ret = a;
	while(*a != '\0')//从数组的末尾处连接(即\0处),所以首先将a指向数组的末尾\0处
	{
		a++;
	}
	while(*b != '\0' && n != 0)
	{
		*a = *b;
		a++;
		b++;
		n--;
	}
	*a = '\0';
	return ret;
}

int myStrcmp(const char *a,const char *b)
{
	while((*a != '\0') && (*b != '\0') && (*a == *b))
	{
		 a++;
		 b++;
	}
	
	if(*a == '\0' || *b == '\0')
	{
		return 0;
	}
	else if(*a > *b)
	{
		return 1;
	}
	else 
	{
		return -1;
	}
}
int myStrncmp(const char *a,const char *b,int n)
{
	while((*a != '\0') && (*b != '\0') && (*a == *b) && (n-1 != 0))
	{
		 a++;
		 b++;
		 n--;
	}
	if(*a == '\0' || *b == '\0' || *a == *b )
	{
		return 0;
	}
	else if(*a > *b)
	{
		return 1;
	}
	else 
	{
		return -1;
	}
}
改良后:

#include"mystring.h"

int myStrlen(const char *a)
{
	int n = 0;
	while(*a++ != '\0')
	{
		n++;
	}
	return n;
}

char *myStrcpy(char *a,const char *b)
{
/*
	函数的返回值是数组a的首地址,
	下面的操作使得a不再是数组的首地址,所以首先将首地址先保存下来
*/
	char *ret = a;

	while((*a++) = (*b++))
	{
		;	
	}
	return ret;
}
char *myStrncpy(char *a,const char *b,int n)
{
	char *ret = a;
/*
	注意&&两边的摆放顺序,若改为 (*a++ = *b++)&&(n-- != 0),将多拷贝一次,
	因为是先拷贝后判断,及时判断不成立,拷贝已经完成,为时已晚 
*/
	while((n-- != 0) && (*a++ = *b++))
	{
		;
	}
	return ret;
}
char *myStrcat(char *a,const char *b)
{
	char *ret = a;
/*
	此句不可以改为(*a++ != '\0'),
	想想我们的目的是(是指针指到a数组的‘\0’处)
	,若改为此句,当*a='\0'时,while循环结束,但后置++仍会执行
	此时*a指到了'\0'的后一个存储空间,所以将数组b连接到'\0'的后面
	由于'\0'在数组b之前,打印时不会打印处b的内容,依然是数组a
*/
	while(*a != '\0')
	{
		a++;	
	}
	while(*a++ = *b++)
	{
		;
	}
/*
	当*b = '\0'时,'\0'赋给a,while('\0')====while(0),所以退出循环,
	注意此时数组b中的‘\0’已经复制过去了,所以while循环之后不用再
	给数组a的最后赋值‘\0’;
*/
	return ret;
}
char *myStrncat(char *a,const char *b,int n)
{
	char *ret = a;
	while(*a != 0)
	{
		a++;
	}
	while((n-- != 0) && (*a++ = *b++))
	{
		;	
	}
/*
	(*a++ = *b++) && (n-- != 0)注意加上括号,
	因为 && 优先级大于 =
*/
	return ret;
}

int myStrcmp(const char *a,const char *b)
{
	while(*a != '\0' && *b != '\0' && *a == *b)
	{
		a++;
		b++;
	}
	if(*a == *b)
	{
		return 0;
	}
	else if(*a >*b)
	{
		return 1;
	}
	else 
	{
		return -1;
	}
}
int myStrncmp(const char *a,const char *b,int n)
{
	while(--n != 0 && *a != '\0' && *b != '\0' && *a == *b)
	{
		a++;
		b++;
	}
	if(*a == *b)
	{
		return 0;
	}
	else if(*a >*b)
	{
		return 1;
	}
	else 
	{
		return -1;
	}
}
主函数:main.cpp

#include"mystring.h"

int main()
{

	char a[20] = "abc";
	char b[] = "acc";

	printf("%d\n",myStrcmp(a,b));
	printf("%d\n",myStrncmp(a,b,1));
	printf("%d\n",myStrlen(a));
	printf("%s\n",myStrcat(a,b));
	printf("%s\n",myStrncat(a,b,2));
	printf("%s\n",myStrcpy(a,b));
	printf("%s\n",myStrncpy(a,b,4));

	return 0;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值