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

来源:互联网 发布:mac查exif 编辑:程序博客网 时间:2024/05/16 16:20
最近比较休闲,找了一些字符串处理的库函数实现了下,欢迎大家多多指点!!
#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++;elsereturn *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

原创粉丝点击