C语言(一) str函数

摘要

用C语言实现strlen、strcmp、strncmp、strcpy、strncpy、strstr

strlen()

size_t strlen (const char *str)
// 计算字符串str的长度,直到空结束字符,但不包括结束字符。返回字符串的长度。

//strlen()
size_t myStrlen (const char* str1)	
//问题:未判断空指针传参
{
	int i=0;
	int len = 0;
	while (str1[i] != '\0')
		{
			len++;
			str1++;
		}
	return len;
}
/*
判断当str[i]不等于\0时,进入while循环,长度len+1,str+1,直到不满足跳出循环,输出len。
	测试用例:str = {“Hello world”};
	测试结果:总共有11个字符
*/

strcmp() 和 strncmp()

int strcmp (const char *str1, const char *str2)
// 把str1所指向的字符串和str2所指向的字符串进行比较。
// 若str1<str2,返回值小于0;若str1=str2,返回值等于0;若str1>str2,返回值大于0。

int strncmp (const char *str1, const char *str2, size_t n)
// 把str1和str2进行比较,最多比较前n个字节。
// 若str1<str2,返回值小于0;若str1=str2,返回值等于0;若str1>str2,返回值大于0。

//strcmp()
int myStrcmp (const char* str1, const char* str2)	
//问题:当*str1或*str2指向为'\0'时缺少return返回
{
	if ((str1 == NULL) || (str2 == NULL))
		{
			return -1;
		}
	if (str1 == str2)
		{
			return 0;
		}
	while ((*str1 != '\0') || (*str2 != '\0'))
		{
			if (*str1 > *str2)
				{
					return (*str1 - *str2);
				}
			else if (*str1 < *str2)
				{
					return (*str1 - *str2);
				}
			else if (*str1 == *str2)
				{
					str1++;
					str2++;
				}
			else
				{
					return -1;
				}
		}
}
/*
字符串str1和str2判空,不为空则判等,相等则返回0,
若不等,判断其中一个字符串是否结束,若某一字符串先结束则输出差值,若相等字符串均为结束则自加。
	测试用例:str1 = {“Hello world”};  str2 = {“Hello world!”};
	测试结果:-33
*/
//strncmp
int myStrncmp (char *str1, const char* str2, int m)
//问题:未判断空指针传参
{
	if (!m)
		{
			return 0;
		}
	while (--m && *str1 && (*str1 == *str2))
	//问题:未控制m不为负数
		{
			str1++;
			str2++;
		}
	return (*str1 - *str2);
}
/*
判断需要比较的字节长度m不为0,当字符相等且不为’\0’时比较下个字符,直到m=0;当字符不相等时直接返回差值。
	测试用例:str1 = {“Hello world”};  str2 = {“Hello world!”};  m=5;
	测试结果:0
	测试用例:str1 = {“Hello world”};  str2 = {“Hello world!”};  m=15;
	测试结果:-33
*/

strcpy() 和 strncpy()

char *strcpy (char *str1, const char *str2)
// 把str2所指向的字符串复制到str1,返回一个指向最终目标字符串str1的指针。

char *strncpy (char *str1, const char *str2, size_t n)
// 把str2所指向的字符串复制到str1,最多复制n个字符,当str2的长度小于n时,str1的剩余部分将用空字节填充。返回最终复制的字符串。

//strcpy
char *myStrcpy (char *str1, char *str2)
//问题:未判断空指针传参
{
	char *temp = str1;
	while (*str1++ = *str2++)
		{
			;
		}
	return temp;
}
/*
保持str1的首地址,拷贝str2指向的字符串到str1指向的地址(包含’\0’),返回str1的首地址。
	测试用例:str1 = {“Hello world”};  str2 = {“world Hello”};
	测试结果:world Hello
*/
//strncpy
char *myStrncpy (char *str1, const char* str2, int m)
{
	char *temp = str1;
	while (m)
		{
			*str1++ = *str2++;
			m--;
		}
	return temp;
}
/*
拷贝保存str1的首地址,按一次复制一个字符直到m置零,返回str1首地址。
	测试用例:str1 = {“Hello world”};  str2 = {“world Hello”};  m=3;
	测试结果:worlo world
*/

strstr()

char *strstr (const char *str1, const char *str2)
// 在字符串str1中查找第一次出现字符串str2的位置,不包括终止符’\0’,
// 返回在str1中第一次出现str2字符串的位置,若未能找到则返回NULL。

//strstr
char *myStrstr (const char *str1, const char *str2)
{
	char *temp1 = (char*) str1;
	char *temp2 = (char*) str2;
	char *temp0 = (char*) str1;
	while (*temp1 != '\0')
		{
			temp0 = temp1;
			temp2 = (char*) str2;
			while ((*temp0 == *temp2) && (*temp2 != '\0'))
				{
					++temp0;
					++temp2;
				}
			if (*temp2 == '\0')
				{
					return temp1;
				}
			++temp1;
		}
	return NULL;
/*
设置指针temp0、temp1、temp2,每当发现temp1所指向的字符==temp2所指向的字符时,temp0代替temp1向后走,
若temp0走到某位置时与temp2所指向的字符不相等,则temp1++,temp0范围temp1的位置,
若temp0走完与temp2匹配的全过程,则匹配成功。
	测试用例:str1 = {“Hello world”};  str2 = {“ll”};
	测试结果:llo world
*/
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值