重构几种常见的字符串处理函数

size_t strlen(const char *str);

int strlenFunction(const char* str)
{
	int count = 0;
	if (str == NULL)
	{
		return 0;
	}
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}

计算字符串开始到 ‘ \0 ’ 之前的字符个数;所以它比sizeof( ) 函数少一个字节的原因;

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

int strcmpFunction(const char *str1, const char *str2)
{
	int result = 0;
	if ((str1 == NULL) || (str2 == NULL))
	{
		cout << "null" << endl;
		return -2;
	}
	while (!(result = *str1 - *str2) && (*str1 != '\0'))
	{
		str1++;
		str2++;
	}
	if (result < 0)
	{
		result = -1;
	}
	else if (result > 0)
	{
		result = 1;
	}
	else
	{
		result = 0;
	}
	return result;
}

记住它是大小写不敏感函数,它是比较 的str1 和 str2 字符串中的单个相应位置的大小;

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

int strncmpFunction(const char *str1, const char *str2, int size_n)
{
	int result = 0;
	if (!size_n)
	{
		return -2;
	}
	while (size_n-- && (*str1 != '\0') && (*str1 == *str2))
	{
		//size_n--;
		str1++;
		str2++;
	}
	result = *str1 - *str2;
	if (result < 0)
	{
		result = -1;
	}
	else if (result > 0)
	{
		result = 1;
	}
	else
	{
		result = 0;
	}
	return result;
}

记住它是大小写不敏感函数,它是比较 的str1 和 str2 字符串中的单个相应位置的大小;它比较的是 0~(size_n - 1)个;

但是不要写为--size_n 这样就少了一次;

 char *strcpy(char *dest, const char *src);

char * strcpyFunction(char *dest, const char *str2)
{
	if ((NULL == str1) || (NULL == str2))
	{
		return NULL;
	}
	if (dest== str2)
	{
		return dest;
	}

	char *dests = dest;
	while (*str2 != '\0')
	{
		*dests++ = *str2++;
	}
	return dest;
}

就是字面意思复制 copy

 char *strncpy(char *dest, const char *src, size_t n);

char * strncpyFunction(char *dest, const char *str2 , int size_n)
{
	if ((NULL == dest) || (NULL == str2))
	{
		return NULL;
	}
	if (dest== str2)
	{
		return dest;
	}

	char *dests = dest;
	while ((*str2 != '\0')&&(size_n--))
	{
		*dests++ = *str2++;
	}
	return dest;
}

strcpy 的衍生,copy str2 字符串前size_n 个字符串到 dest中 //0~(size_n - 1)个

char *strcat(char *dest, const char *src); 

char * strcatFunction(char *dest, const char *str2)
{
	if ((NULL == dest) && (NULL == str2))
	{
		return NULL;
	}

	char *dests = dest;
	for (dests; *dests != '\0'; dests++);
	while (*str2  != '\0')
	{
		*dests++ = *str2++;
	}
	*dests++ = '\0';
	return dest;
}

dest + str2 //真清楚

 char * strrev(char *str);

char * strrevFunction(char *str)
{
	if (NULL == str)
	{
		return NULL;
	}

	char *s_right = str;
	char *s_left = str;
	char _str;
	for (s_right; *s_right != '\0'; s_right++)
	{
		;
	}
	--s_right;//del'\0'
	while (s_left < s_right)
	{
		_str = *s_left;
		*s_left++ = *s_right;
		*s_right-- = _str;
	} //while (s_left = s_right);
	return str;
}

 字符串的旋转,举个例子:

                                          char *str = "you cool "; 用过函数后变为下面的一坨不明物体

                                          char *str = "looc uoy";

有啥用?暂时还不知到!!

 char * strlwr(char * strlwr);

char * strlwrFunction(char * strlwr)
{
	if (NULL == strlwr)
	{
		return NULL;
	}
	char *str;
	str = strlwr;
	while (*str != '\0')
	{
		if (*str >= 'A' && *str <= 'Z')
		{
			*str += ('a' - 'A');
		}
		str++;//地址下移
	}
	return strlwr;
}

字符串全转为小写

char* strupr(char * strupr); 

char* struprFunction(char * strupr)
{
	if (NULL == strupr)
	{
		return NULL;
	}
	char *str;
	str = strupr;
	while (*str != '\0')
	{
		if (*str >= 'a' && *str <= 'z')
		{
			*str += ('A' - 'a');
		}
		str++;
	}
	return strupr;
}

字符串全转为大写

对应的可以写出 单个字符转换

int tolower(int tolower);

int toupper(int toupper);

//重置tolower,字母小写转换
int tolowerFunction(int tolower)
{
	if ((tolower >= 'A') && (tolower <= 'Z'))
	{
		return tolower + ('a' - 'A');//差值-\+32
	}
	else
	{
		return tolower;
	}

}
//重置toupper,字母大写转换
int toupperFunction(int toupper)
{
	if ((toupper >= 'a') && (toupper <= 'z'))
	{
		return toupper + ('A' - 'a');
	}
	else
	{
		return toupper;
	}
}

 

利用上面单个字符大小写转换函数,可以完成敏感函数的重构;

int strnicmp(const char *str1, const char *str2, int size_n);

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

//重置strnicmp,
int strnicmpFunction(const char *str1, const char *str2, int size_n)
{
	int result = 0;
	if (!size_n)
	{
		return -2;
	}
	while (--size_n && (*str1 != '\0') && (tolowerFunction(*str1) == tolowerFunction(*str2)))
	{
		//size_n--;
		str1++;
		str2++;
	}
	result = tolowerFunction(*str1) - tolowerFunction(*str2);
	if (result < 0)
	{
		result = -1;
	}
	else if (result > 0)
	{
		result = 1;
	}
	else
	{
		result = 0;
	}
	return result;
}
//重置stricmp
int stricmpFunction(const char *str1, const char *str2)
{
	int result = 0;
	if ((str1 == NULL) || (str2 == NULL))
	{
		cout << "null" << endl;
		return -2;
	}

	while (!(result = toupperFunction(*str1) - toupperFunction(*str2)) && (*str1 != '\0'))
	{
		str1++;
		str2++;
	}
	if (result < 0)
	{
		result = -1;
	}
	else if (result > 0)
	{
		result = 1;
	}
	else
	{
		result = 0;
	}
	return result;
}

 

 int atoiFunction(const char *str);

int atoiFunction(const char *str)
{
	if (NULL == str)
	{
		return 0;
	}
	int number = 0, flag = 0;

	while (*str == ' ')
	{
		str++;
	}
	if (*str == '-')
	{
		flag = -1;
		++str;
	}
	else
	{
		flag = 1;		
	}

	while (*str >= '0'&&*str <= '9')
	{
		number = number * 10 + *str - '0';
		str++;
	}
	return number * flag;
}

将字符串转为整形,atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负号才开始做转换,而再遇到非数字或字符串时('\0')才结束转化,并将结果返回(返回转换后的整型数)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值