一些C语言字符串处理的库函数

最近比较休闲,找了一些字符串处理的库函数实现了下,欢迎大家多多指点!!
#ifndef _PV_STRLIB_H_
#define _PV_STRLIB_H_

#include <stdio.h>
#include <assert.h>

int pv_strlen(char * str)
{
	assert(str);
	char * p = str;
	while (*p)
		++p;
	return p - str;
}

char * pv_strrev(char * str)
{
	assert(str);
	char * left = str;
	char * right = str;
	char ch;
	while (*right)
		++right;
	--right;
	while (left < right)
	{
		ch = *left;
		*left++ = *right;
		*right-- = ch;
	}
	return str;
}

char * pv_strchr(char * str, char ch)
{
	assert(str);
	while (*str && (*str != ch))
		str++;
	return *str ? str : NULL;
}

char * pv_strrchr(char * str, char ch)
{
	char * p = NULL;
	do
	{
		(*str == ch) && (p = str);
	}while (*str++);
	return p;
}

// 比较字符串str1和str2的前n个字符串字典序的大小,不区分字母大小写
int pv_strnicmp(char * strA, char * strB, int n)
{
	assert(strA && strB && (n > 0));
	char chA, chB;
	do
	{
		chA = (*strA >= 'a' && *strA <= 'z') ? *strA - 32 : *strA;
		chB = (*strB >= 'a' && *strB <= 'z') ? *strB - 32 : *strB;
		if (chA == chB)
			continue;
		return chA - chB;
	}while (--n && *strA++ && *strB++);

	return 0;
}

char * pv_strnset(char * str, char ch, int n)
{
	assert(str);
	char * p = str;
	while (n--)
		*p++ = ch;
	return str;
}

int pv_stricmp(char * strA, char * strB)
{
	assert(strA && strB);
	char chA, chB;
	while (*strA && *strB)
	{
		chA = (*strA >= 'a' && *strA <= 'z') ? *strA -32 : *strA;
		chB = (*strB >= 'a' && *strB <= 'z') ? *strB -32 : *strB;
		if (chA - chB)
			break;
		strA++ && strB++;
	}
	return chA - chB;
}

int pv_strspn(char * str, char * ctrl)
{
	assert(str && ctrl);
	char map[32] = {0};
	char * ptr = str;
	while (*ctrl)
	{
		map[*ctrl >> 3] |= (1 << (*ctrl & 7));
		ctrl++;
	}

	while (map[*str >> 3] & (1 << (*str & 7)))
		str++;

	return str - ptr;
}

int pv_strcspn(char * str, char * ctrl)
{
	assert(str && ctrl);
	char map[32] = {0};
	char * ptr = str;

	while (*ctrl)
	{
		map[*ctrl >> 3] |= (1 << (*ctrl & 7));
		ctrl++;
	}

	while (!(map[*str >> 3] & (1 << (*str & 7))))
		str++;

	return str - ptr;
}

char * pv_strncat(char * dst, char * src, int n)
{
	assert(dst && src && n > 0);
	char * ptr = dst;
	while (*dst)
		++dst;

	while (n > 0)
		(*dst++ = *src++) && n--;
	*dst = 0;

	return ptr;
}

int pv_strcmpi(char * strA, char * strB)
{
	assert(strA && strB);
	char chA, chB;
	while (*strA && *strB)
	{
		chA = (*strA >= 'a' && *strA <= 'z') ? *strA -32 : *strA;
		chB = (*strB >= 'a' && *strB <= 'z') ? *strB -32 : *strB;
		if (chA - chB)
			break;
		strA++ && strB++;
	}
	return chA - chB;
}

int pv_strcmp(char * strA, char * strB)
{
	assert(strA && strB);
	while (*strA && *strB && (*strA == *strB))
		strA++ && strB++;
	return *strA - *strB;
}

int pv_strncmp(char * strA, char * strB, int n)
{
	assert(strA && strB);
	while (n--)
	{
		if (*strA == *strB)
			strA++ && strB++;
		else
			return *strA - *strB;
	}
	return 0;
}

char * pv_strcpy(char * dst, char * src)
{
	assert(dst && src);
	char * p = src;
	while (*dst++ = *src++);
	return p;
}

char * pv_strcat(char * dst, char * src)
{
	assert(dst && src);
	char * p = dst;
	while (*dst++);
	dst--;
	while (*dst++ = *src++);
	return p;
}

int pv_strncpy(char * dst, char * src, int n)
{
	assert(dst && src);
	while (n--)
		*dst++ = *src++;
	return *dst = 0;
}

char * pv_strstr(char * str, char * sub_str)
{
	assert(str && sub_str);
	int n = pv_strlen(sub_str);	
	if (n == 0)
		return str;

	while (*str - *sub_str || pv_strncmp(str, sub_str, n))
		str++;
	return *str ? str : NULL;
}

// 大小写转换
char * pv_strlwr(char * str)
{
	assert(str);
	char * p = str;
	do
	{
		(*p >= 'A') && (*p <= 'Z') && (*p += 32);
	}while(*p++);
	return str;
}

char * pv_strupr(char * str)
{
	assert(str);
	char * p = str;
	do
	{
		(*p >= 'a') && (*p <= 'z') && (*p -= 32);
	}while(*p++);
	return str;
}

#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值