欢迎来到我的博客https://www.cnblogs.com/veis/

https://www.cnblogs.com/veis/p/14182037.html

字符与字符串处理函数

/*
 * 功能简介:比较两个整数的大小,返回小者
 * 参    数:a 整数1,b 整数2
 * 返 回 值:返回值较小的数字
 */
int min(int a, int b)
{
    return a > b ? b : a;
}

/*
 * 功能简介:比较两个整数的大小,返回大者
 * 参    数:a 整数1,b 整数2
 * 返 回 值:返回值较大的数字
 */
int max(int a, int b)
{
    return a > b ? a : b;
}

/*
 * 功能简介:把数字字符转成整数
 * 参    数:ch 待转换为数字的字符
 * 返 回 值:如果字符为数字字符,则返回对应数字,否则返回-1
 */
int ctoi(const char ch)
{
    if(ch >= '0' && ch <= '9') return (ch - '0');
    return -1;
}

/*
 * 功能简介:求x的y次幂
 * 参    数:x 底数,y 指数(幂)
 * 返 回 值:返回x的y次幂
 */
unsigned long _pow(const unsigned int x,unsigned const int y)
{
    int i = 0;
    int ret = 1;
    
    if(y == 0) return 1;

    for(i = 0; i < y; ++i) { ret = ret * x; }

    return ret;   
}

/*
 * 功能简介:字符串转整数,遇到非数字字符则结束循环
 * 参    数:nptr 需要转换为数字的字符串
 * 返 回 值:转换成功返回对应整数,否则返回0
 */
int _atoi(const char *nptr)
{
    int ret = 0;
    char sign = 0; // 符号标志
    int i = 0;
    const char *p = nptr;
    // 判断是否为负数字符串,即需满足第一个字符为符号,第二个字符为数字字符
    if(*nptr == '-' && (*(nptr+1) >= '0' && *(nptr+1) <= '9') ) { ++p; sign = 1; };

    for(i = 0; (*p != '\0') && (*p >= '0' && *p <= '9'); ++i) {
        ret = 10 * ret + ((*p++) - '0');
    }
    if(sign == 1 && ret != 0)
        ret = 0 - ret;

    return ret;
}

/*
 * 功能简介:字符串转长整型,遇到非数字字符则结束循环
 * 参    数:nptr 需要转换为数字的字符串
 * 返 回 值:转换成功返回对应整数,否则返回0
 */
long _atol(const char *nptr)
{
    long ret = 0;
    char sign = 0; // 符号标志
    int i = 0;
    const char *p = nptr;

    // 判断是否为负数字符串,即需满足第一个字符为符号,第二个字符为数字字符
    if(*nptr == '-' && (*(nptr+1) >= '0' && *(nptr+1) <= '9') ) { ++p; sign = 1; };

    for(i = 0; (*p != '\0') && (*p >= '0' && *p <= '9'); ++i) {
        ret = 10 * ret + ((*p++) - '0');
    }
    if(sign == 1 && ret != 0) // 取反
        ret = 0 - ret;

    return ret;
}

// 若ch是大写字母('A'-'Z')或('a'-'z')或('0'-'9')返回非0,否则返回0。
int _isalnum(int ch)
{
    if((ch >= '0' && ch <= '9') || 
       (ch >= 'a' && ch <= 'z') || 
       (ch >= 'A' && ch <= 'z') 
    )
        return !0;
    return 0;
}

// 若ch是'0'-'9'返回非0,否则返回0。
int _isdigit(int ch)
{
    if((ch >= '0' && ch <= '9'))
        return !0;
    return 0;
}

// 若ch是字母('A'-'Z')或('a'-'z')返回非0,否则返回0。 
int _isalpha(int ch)
{
    if((ch >= 'a' && ch <= 'z') || 
       (ch >= 'A' && ch <= 'z') 
    )
        return !0;
    return 0;
}

// 若ch是大写返回非0值,否则返回0。 
int _isupper(int ch)
{
    if(ch >= 'A' && ch <= 'Z')
        return !0;
    return 0;
}

// 若ch是小写返回非0值,否则返回0。 
int _islower(int ch)
{
    if(ch >= 'a' && ch <= 'z')
        return !0;
    return 0;
}

// 若ch是大写字母('A'-'Z')返回相应的小写字母('a'-'z')。
int _tolower(int ch)
{
    if(ch >= 'A' && ch <= 'Z')
        return ch - 'A' + 'a';
    return ch;
}

// 若ch是小写字母('a'-'z')返回相应的大写字母('A'-'Z')
int _toupper(int ch)
{
    if(ch >= 'a' && ch <= 'z')
        return ch - 'a' + 'A';
    return ch;
}

int _ctoi(const char ch)
{
    if(ch >= '0' && ch <= '9') return ch - '0';

    return -1;
}

// 取绝对值
double _fabs(const double x)
{
    if(x >= 0) return x;
    
    return 0-x;
}


// 四舍五入
double _round(const double x)
{
    long ret = 0;
    if(x >= 0) ret = x + 0.5; 
    else ret = x - 0.5;
    return ret;
} 

// 向上取整数
double _ceil(const double x)
{
    long tmp;

    if(x > 0) { 
        tmp = (long)x; 
        if(tmp != x) tmp = tmp + 1;
        return tmp;        
     }
    else { tmp = (long)x; return tmp; }
}

// 向下取整数
double _floor(const double x)
{
    long tmp;

    if(x > 0) { 
        tmp = (long)x; 
     }
    else { 
        tmp = (long)x;
        if(tmp != x) tmp = tmp - 1;
     }
     return tmp;        
}

// 把双精度val分解成整数部分和小数部分,整数部分存放在ip所指的变量中,返回小数部分
double _modf(double val,double *ip)
{
    long tmp = val;

    if(ip != NULL) (*ip) = tmp;

    return val - tmp;
}

size_t _strlen(const char *str)
{
    size_t nlen = 0;
    
    while(*str++ != '\0') ++nlen;

    return nlen;
}

char * _strcpy(char *dest, const char *src)
{
    while(*src != '\0') *dest++ = *src++;
    
    *dest = '\0';
    
    return dest;
}

char * _strncpy(char *dest, const char *src, size_t len)
{
    size_t i = 0;
    size_t src_len = _strlen(src);

    if(src_len > len) src_len = len;

    while(i < src_len)
    {
        dest[i] = src[i];
        ++i;
    }
    dest[i] = '\0';

    return dest;
}

char * _strcat(char *dest, const char *src)
{
    int dest_len = _strlen(dest);
    int i = 0;

    while(src[i] != '\0')
    {
        dest[dest_len + i] = src[i];
        ++i; 
    }
    dest[i] = '\0';
    return dest;
}

char * _strncat(char *dest, const char *src, size_t len)
{
    size_t dest_len = _strlen(dest);
    size_t src_len = _strlen(src);
    size_t i = 0;
    
    if(src_len > len) src_len = len;   
 
    while(i < src_len)
    {
        dest[dest_len + i] = src[i];
        ++i; 
    }
    dest[dest_len + i] = '\0';
    return dest;
}

char * _strchr(const char *s, const int c)
{
    size_t len = _strlen(s); 
    size_t i = 0;    

    while(i < len) { if(s[i] == c) return (char *)(&(s[i])); ++i; }

    return NULL;
}

char * _strrchr(const char *s, const int c)
{
    size_t len = _strlen(s); 
    size_t i = len - 1;    

    while(i >= 0) { if(s[i] == c) return (char *)(&(s[i])); --i; }

    return NULL;
}

int _strcmp(const char *s1, const char *s2)
{
    int i = 0;
    size_t len = 0;
    size_t s1_len = _strlen(s1);
    size_t s2_len = _strlen(s2);
    
    if(s1_len > s2_len) len = s2_len;
    else len = s1_len;

    for(i = 0; i < len; ++i)
    {
        if(s1[i] == s2[i]) continue;
        else break;       
    }

    if((i == len) && (s1_len == s2_len)) return 0;

    if(s1[i] > s2[i]) return 1;
    
    return -1; 
}

int _strncmp(const char *s1, const char *s2, const size_t n)
{
    int i = 0;
    
    for(i = 0; i < n; ++i)
    {
        if(s1[i] == s2[i]) continue;
        else break;
    }

    if(i == n) return 0;
    else if(s1[i] > s2[i]) return 1;

    return -1;
}

char * _strstr(const char *str, const char * substr)
{
    char *pos = (char *) str; // 待搜索字符串的位置。
    char *pos1 = 0;

    while (1)
    {
        if (pos[0] == 0) break;  // 如果待搜索的字符串已结束,break。

        pos1 = _strchr(pos,substr[0]);  // 在pos中查找子字符串的首字符。

        if (pos1 == 0) return 0;  // 如果没有找到,直接返回0。

        if (_strncmp(pos1, substr, _strlen(substr)) == 0) return pos1; // 如果找到了,返回找到的地址。

        pos++;  // 待搜索的位置后移一个字节。
    }

  return NULL;
}

// 安全版本的字符串拷贝函数
char * _strcpy_s(char *dest, const size_t destlen, const char *src)
{
    size_t src_len = _strlen(src);
    size_t len = destlen;
    size_t i = 0;

    if(src_len < len) len = src_len;

    memset(dest, 0, destlen);

    for(i = 0; i < len; ++i)
    {
        dest[i] = src[i];
    }
    return dest; 
}

// 安全版本的字符串拷贝函数
char * _strncpy_s(char *dest, const size_t destlen, const char *src, const size_t n)
{
    size_t len = destlen;
    size_t i = 0;

    if(n < len) len = n;

    memset(dest, 0, destlen);

    for(i = 0; i < len; ++i)
    {
        dest[i] = src[i];
    }
    return dest; 
}

// 安全版本的字符串连接函数
char * _strcat_s(char *dest, const size_t destlen, const char *src)
{
    int i = 0;
    int src_len = _strlen(src);
    int len = destlen - _strlen(dest) - 1; // 剩余可用空间
    int start = _strlen(dest); 

    memset(dest + start, 0, len);

    if(src_len < len) len = src_len;

    for(i = 0; i < len; ++i)
    {
        dest[start + i] = src[i];
    }

    return dest;
}

// 安全版本的字符串连接函数
char * _strncat_s(char *dest, const size_t destlen, const char *src, const size_t n)
{
    int i = 0;
    int len = destlen - _strlen(dest) - 1; // 剩余可用空间
    int start = _strlen(dest); 

    memset(dest + start, 0, len);

    if(n < len) len = n;

    for(i = 0; i < len; ++i)
    {
        dest[start + i] = src[i];
    }
    
   return dest;
}

// 删除字符串左边指定的字符
void delete_lchar(char *str,const char in_char)
{
    char strTemp[_strlen(str)+1];
    int iTemp=0;

    if (str == 0) return;
    if (_strlen(str) == 0) return;

    memset(strTemp,0,sizeof(strTemp));
    strcpy(strTemp,str);

    while ( strTemp[iTemp] == in_char )  iTemp++;
    memset(str,0,strlen(str)+1);
    strcpy(str,strTemp+iTemp);

    return; 
}

// 删除字符串右边指定的字符
void delete_rchar(char *str,const char in_char)
{
    size_t len = _strlen(str);
    if(str == NULL) return;
 
    while(len > 0)
    {
        if(str[--len] == in_char)
            str[len] = '\0';
        else break;
    }
}

// 删除字符串两边指定的字符
void delete_lr_char(char *str,const char in_char)
{
   delete_lchar(str, in_char); 
   delete_rchar(str, in_char); 
}

// 删除字符串中间的字符串
void delete_mid_str(char *str,const char *in_str)
{
    int i = 0;
    int nlen = 0;
    char *p = NULL;

    if(str == NULL || in_str == NULL) return;

    nlen = _strlen(in_str);

    if(_strlen(str) == 0 || nlen == 0) return; 

    p =  _strstr(str, in_str);
    
    if(p != NULL) _strcpy(p, p + nlen);
}

  

posted @ 2020-11-01 22:24  veis  阅读(146)  评论(0编辑  收藏  举报