最近比较休闲,找了一些字符串处理的库函数实现了下,欢迎大家多多指点!!
#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