方便易用的字符串处理函数

不用string.h库函数的,减少库的使用,解决那些需要小代码量,但苦恼于没有简易的字符串处理函数的郁闷

<<<<<<<<<<<<<<<<mystring.h>>>>>>>>>>>>>>>>>>>>

/**
  ******************************************************************************
  * 文件名:myString.h
  * 作者  :jhb
  * 版本号:V2.1.0
  * 日期  :2018-05-19
  * 说明  :  
  ******************************************************************************
 **/

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __MYSTRING_H
#define __MYSTRING_H


/* 包含头文件 ----------------------------------------------------------------*/

/* 宏定义 --------------------------------------------------------------------*/

/* 变量声明 ------------------------------------------------------------------*/

/* 函数声明 ------------------------------------------------------------------*/
char *itoa_private(int val, char *buf, unsigned radix);//整数转字符串
int my_isdigit(int ch);//判断字符是否为数字
long long StrToInt(const char *s,int sign);//字符串转数字
int atoi_32(const char *s);//将字符串str转换为32位整型,其正数的最值为0x7FFFFFFF,负数的最小值为0x80000000,考虑数字会溢出的情况
void LettersChange(unsigned char*str, unsigned char font);//大小写字母变成大小写字母
signed int st_strlen(unsigned char* str);//获取字符串长度
signed int st_strcmp(unsigned char *s,unsigned char *t);//比较两个字符串大小
unsigned char *st_strcpy(unsigned char *t,unsigned char *s);//字符串拷贝
signed int st_strncmp(unsigned char *dest,unsigned char *src,unsigned int Len);//可变长度字符串大小比较
signed char st_toupper(unsigned char c);//小写字符转化为大写字符
unsigned char *st_strcat(unsigned char *s,unsigned char *t);//字符串连接
signed int st_memcpy(unsigned char *dest, unsigned char *src, unsigned int Len);//可变长度内存拷贝
signed int st_memset(unsigned char *dest,unsigned char byte, unsigned int Len);//设置长度为Len的内存块为byte
signed int st_memcmp(unsigned char* dest, unsigned char* src, unsigned int Len);//内存段内数据比较
int gsmInvertNumbers(const char* pSrc, char* pDst, int nSrcLength);//正常顺序的字符串转换为两两颠倒的字符串,若长度为奇数,补'F'凑成偶数
int gsmSerializeNumbers(const char* pSrc, char* pDst, int nSrcLength);//两两颠倒的字符串转换为正常顺序的字符串
int gsmEncode7bit(const char* pSrc, unsigned char* pDst, int nSrcLength);//7bit编码
int gsmDecode7bit(const unsigned char* pSrc, char* pDst, int nSrcLength);//7bit解码
int gsmString2Bytes(const char* pSrc, unsigned char* pDst, int nSrcLength);//可打印字符串转换为字节数据
int gsmBytes2String(const unsigned char* pSrc, char* pDst, int nSrcLength);//字节数据转换为可打印字符串
#endif

/******************* (C)********END OF FILE************************************/

<<<<<<<<<<<<<<<<mystring.c>>>>>>>>>>>>>>>>>>>>

/**
  ******************************************************************************
  * 文件名:myString.c
  * 作者  :jhb
  * 版本号:V2.1.0
  * 日期  :2018-05-19
  * 说明  :  
  ******************************************************************************
 **/
/* 包含头文件 ----------------------------------------------------------------*/
#include <stdio.h>
#include "myString.h"
/* 全局变量定义 --------------------------------------------------------------*/

/* 外部变量声明 --------------------------------------------------------------*/

/* 功能函数 ------------------------------------------------------------------*/
/******请保证以下函数若有传入缓冲区的参数,请保证缓冲区足够大,避免出现溢出*******/
/*******************************************************************************
* FunctionName   : char *itoa_private(int val, char *buf, unsigned radix)
* Description    : 整数转字符串
* EntryParameter : val->需要转换的整数,buf->转换后的字符串缓冲区,radix->转换后的进制
* ReturnValue    : 转换后的字符串
*******************************************************************************/
char *itoa_private(int val, char *buf, unsigned radix)
{
    char   *p;
    char   *firstdig;
    char   temp;
    unsigned   digval;
    p = buf;
    if (val <0)
    {
        *p++ = '-';
        val = (unsigned long)(-(long)val);
    }
    firstdig = p;
    do{
        digval = (unsigned)(val % radix);
        val /= radix;

        if (digval > 9)
            *p++ = (char)(digval - 10 + 'a');
        else
            *p++ = (char)(digval + '0');
    } while (val > 0);

    *p-- = '\0';
    do{
        temp = *p;
        *p = *firstdig;
        *firstdig = temp;
        --p;
        ++firstdig;
    } while (firstdig < p);
    return buf;
}
/*******************************************************************************
* FunctionName   : int my_isdigit(int ch)
* Description    : 判断字符是否为数字
* EntryParameter : ch->需要判断的字符
* ReturnValue    : 1:数字 0:字符
*******************************************************************************/
int my_isdigit(int ch)
{
    return (unsigned int)(ch - '0') < 10u;

}
/*********字符串转数字***************/

enum {kValid = 0,kInvalid};
int g_nStatus = kValid;  //全局变量用于判断是非法输入还是字符串为空
long long StrToInt(const char *s,int sign)
{
    long long num = 0;
    while(*s != '\0'){
        if(!my_isdigit(*s)){
            g_nStatus = kInvalid;  //表示非法输入
            num = 0;
            break;
        }
        num = num * 10 + *s - '0';
        if(((sign > 0) && (sign * num > 0x7FFFFFFF)) ||
            ((sign < 0) && (sign * num < (signed int)0x80000000))){  //注意这里的类型提升,因此要强制转换
            num = 0;
            break;
        }
        s++;
    }
    return sign * num;
}
/*******************************************************************************
* FunctionName   : atoi_32
* Description    : 将字符串str转换为32位整型,其正数的最值为0x7FFFFFFF,负数的最小值为0x80000000,考虑数字会溢出的情况
* EntryParameter : s->需要转换的字符串
* ReturnValue    : 转换后的数据
*******************************************************************************/
int atoi_32(const char *s)
{
    long long num;
    int sign;
    sign = 1;
    
    if(s == NULL || *s == '\0'){
        return 0;
    }
    if(*s == '+')
        ++s;
    else if (*s == '-'){
        ++s;
        sign = -1;
    }
    if (*s == '\0'){
        g_nStatus = kInvalid;  //表示非法输入
        return 0;
    }
    else
        num = StrToInt(s,sign);

    return (int)num;
}
/*******************************************************************************
* FunctionName   : LettersChange
* Description    :大小写字母变成大小写字母
例如:ABC->abc 或 abc->ABC
* EntryParameter : str->需要转换的字符串与转换后的字符串,font:0-->转小写,1-->转大写
* ReturnValue    : 无
*******************************************************************************/
void LettersChange(unsigned char *str, unsigned char font)
{
    int i;
    if (font == 0)
    {
        for (i = 0; str[i] != '\0'; i++)
        {
            if (str[i] >= 'A'&&str[i] <= 'Z')str[i] += 32;
        }
    }
    else if (font == 1)
    {
        for (i = 0; str[i] != '\0'; i++)
        {
            if (str[i] >= 'a'&&str[i] <= 'z')str[i] -= 32;
        }
    }
}
/*******************************************************************************
* FunctionName   : st_strlen(类似标准库函数strlen)
* Description    :获取字符串长度
* EntryParameter : str->需要判断的字符串
* ReturnValue    : 字符串长度
*******************************************************************************/
signed int st_strlen(unsigned char* str)
{
    int i = 0;
    if(str != NULL)
    {
        while(*str++)
        {
            i++;
        }
    }
    
    return i;
}
/*******************************************************************************
* FunctionName   : st_strcmp(类似标准库函strcmp)
* Description    : 比较两个字符串大小
* EntryParameter : s,t->需要判断的字符串
* ReturnValue    : s相对于t的大小
*******************************************************************************/
signed int st_strcmp(unsigned char *s,unsigned char *t)
{
    while(*s == *t)
    {
        if(*s == 0)
        {
            return(0);
        }
        ++s;
        ++t;
    }
    
    return (*s - *t);
}
/*******************************************************************************
* FunctionName   : st_strcpy(类似标准库函strcpy)
* Description    : 字符串拷贝
* EntryParameter : t->目的字符串,s->源字符串
* ReturnValue    : 目的字符串首地址
*******************************************************************************/
unsigned char *st_strcpy(unsigned char *t,unsigned char *s)
{
    unsigned char *d;

    d = t;
    while(*s)
    {
       *t++ = *s++;
    }
    *t = 0x0;            // Add string terminator

    return(d);
}

/*******************************************************************************
* FunctionName   : st_strncmp(类似标准库函strncmp)
* Description    : 可变长度字符串大小比较
* EntryParameter : dest,src->需要比较的字符串,Len->需要比较的长度
* ReturnValue    : 0:相同     1:dest大于src         -1:src>dest
*******************************************************************************/
signed int st_strncmp(unsigned char *dest,unsigned char *src,unsigned int Len)
{
    signed int i = 0;

    for(i = 0; i < Len; i++)
    {
        if(dest[i] != src[i])
        {
            if(dest[i] > src[i])
            {
                return 1;
            }
            else
            {
                return -1;
            }
        }
    }

    return 0;

}

/*******************************************************************************
* FunctionName   : signed char st_toupper(unsigned char c)
* Description    : 小写字符转化为大写字符
* EntryParameter : c需要转换的字符
* ReturnValue    : 转换后字符
*******************************************************************************/
signed char st_toupper(unsigned char c)
{
    if(((c >= 'A') && (c <= 'Z')) || ((c >= 'a') && (c <= 'z')))
    {
        c &= 0xDF;
    }
    
    return c;
}

/*******************************************************************************
* FunctionName   : st_strcat(类似标准库函strcat)
* Description    : 字符串连接
* EntryParameter : s-->被拼接的字符串 t-->拼接的字符串
* ReturnValue    : 拼接后的字符串首地址
*******************************************************************************/
unsigned char *st_strcat(unsigned char *s, unsigned char *t)
{
    unsigned char *d;
    
    d = s;
    --s;
    while(*++s);

    do
    {
        *s = *t++;
    }
    while(*s++);

    return(d);
}

/*******************************************************************************
* FunctionName   : st_memcpy(类似标准库函memcpy)
* Description    : 可变长度内存拷贝
* EntryParameter : dest-->目的字符串 src-->源字符串,Len-->拷贝长度
* ReturnValue    : 拷贝成功的长度
*******************************************************************************/
signed int st_memcpy(unsigned char *dest, unsigned char *src, unsigned int Len)
{
    signed int i = 0;

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

    return(Len);
}

/*******************************************************************************
* FunctionName   : st_memset(类似标准库函memset)
* Description    : 设置长度为Len的内存块为byte
* EntryParameter : dest-->目的字符串 byte-->设置的值,Len-->设置长度
* ReturnValue    : 设置成功的长度
*******************************************************************************/
signed int st_memset(unsigned char *dest,unsigned char byte, unsigned int Len)
{
    signed int i = 0;

    for(i = 0; i < Len; i++)
    {
        dest[i] = byte;
    }

    return(Len);
}

/*******************************************************************************
* FunctionName   : st_memcmp(类似标准库函memcmp)
* Description    : 内存段内数据比较
* EntryParameter : dest、src-->比较的内存段,Len-->比较长度长度
* ReturnValue    : 0:相同     1:dest大于src         -1:src>dest
*******************************************************************************/
signed int st_memcmp(unsigned char* dest, unsigned char* src, unsigned int Len)
{
    unsigned int i;

    for(i = 0; i < Len; i++)
    {
        if(dest[i] != src[i])
        {
            if(dest[i] > src[i])
            {
                return 1;
            }
            else
            {
                return -1;
            }
        }
    }
    
    return 0;
}

/*******************************************************************************
* FunctionName   : int gsmInvertNumbers(const char* pSrc, char* pDst, int nSrcLength)
* Description    : 正常顺序的字符串转换为两两颠倒的字符串,若长度为奇数,补'F'凑成偶数
如:"8613851872468" --> "683158812764F8"
* EntryParameter : pSrc - 源字符串指针 pDst - 目标字符串指针 nSrcLength - 源字符串长度
* ReturnValue    :目标字符串长度
*******************************************************************************/
int gsmInvertNumbers(const char* pSrc, char* pDst, int nSrcLength)
{
    int nDstLength;        // 目标字符串长度
    char ch;            // 用于保存一个字符
    int i=0;
    // 复制串长度
    nDstLength = nSrcLength;

    // 两两颠倒
    for(i=0;i<nSrcLength;i+=2)
    {
        ch = *pSrc++;        // 保存先出现的字符
        *pDst++ = *pSrc++;    // 复制后出现的字符
        *pDst++ = ch;        // 复制先出现的字符
    }

    // 源串长度是奇数吗?
    if(nSrcLength & 1)
    {
        *(pDst-2) = 'F';    // 补'F'
        nDstLength++;        // 目标串长度加1
    }

    // 输出字符串加个结束符
    *pDst = '\0';

    // 返回目标字符串长度
    return nDstLength;
}
/*******************************************************************************
* FunctionName   : int gsmSerializeNumbers(const char* pSrc, char* pDst, int nSrcLength)
* Description    : 两两颠倒的字符串转换为正常顺序的字符串
如:"683158812764F8" --> "8613851872468"
* EntryParameter : pSrc - 源字符串指针 pDst - 目标字符串指针 nSrcLength - 源字符串长度
* ReturnValue    :目标字符串长度
*******************************************************************************/
int gsmSerializeNumbers(const char* pSrc, char* pDst, int nSrcLength)
{
    int nDstLength;        // 目标字符串长度
    char ch;            // 用于保存一个字符
    int i=0;
    // 复制串长度
    nDstLength = nSrcLength;    
    // 两两颠倒
    for(i=0; i<nSrcLength;i+=2)
    {
        ch = *pSrc++;        // 保存先出现的字符
        *pDst++ = *pSrc++;    // 复制后出现的字符
        *pDst++ = ch;        // 复制先出现的字符
    }

    // 最后的字符是'F'吗?
    if(*(pDst-1) == 'F')
    {
        pDst--;
        nDstLength--;        // 目标字符串长度减1
    }

    // 输出字符串加个结束符
    *pDst = '\0';

    // 返回目标字符串长度
    return nDstLength;
}
/*******************************************************************************
* FunctionName   : int gsmSerializeNumbers(const char* pSrc, char* pDst, int nSrcLength)
* Description    : 7bit编码
如:"683158812764F8" --> "8613851872468"
* EntryParameter : pSrc - 源字符串指针 pDst - 目标编码串指针 nSrcLength - 源字符串长度
* ReturnValue    :目标编码串长度
*******************************************************************************/
int gsmEncode7bit(const char* pSrc, unsigned char* pDst, int nSrcLength)
{
    int nSrc;        // 源字符串的计数值
    int nDst;        // 目标编码串的计数值
    int nChar;        // 当前正在处理的组内字符字节的序号,范围是0-7
    unsigned char nLeft;    // 上一字节残余的数据

    // 计数值初始化
    nSrc = 0;
    nDst = 0;

    // 将源串每8个字节分为一组,压缩成7个字节
    // 循环该处理过程,直至源串被处理完
    // 如果分组不到8字节,也能正确处理
    while (nSrc < nSrcLength)
    {
        // 取源字符串的计数值的最低3位
        nChar = nSrc & 7;

        // 处理源串的每个字节
        if(nChar == 0)
        {
            // 组内第一个字节,只是保存起来,待处理下一个字节时使用
            nLeft = *pSrc;
        }
        else
        {
            // 组内其它字节,将其右边部分与残余数据相加,得到一个目标编码字节
            *pDst = (*pSrc << (8-nChar)) | nLeft;

            // 将该字节剩下的左边部分,作为残余数据保存起来
            nLeft = *pSrc >> nChar;

            // 修改目标串的指针和计数值
            pDst++;
            nDst++;
        }

        // 修改源串的指针和计数值
        pSrc++;
        nSrc++;
    }

    // 返回目标串长度
    return nDst;
}
/*******************************************************************************
* FunctionName   : int gsmDecode7bit(const unsigned char* pSrc, char* pDst, int nSrcLength)
* Description    : 7bit解码
如:"683158812764F8" --> "8613851872468"
* EntryParameter : pSrc - 源编码串指针 pDst - 目标字符串指针 nSrcLength - 源编码串长度
* ReturnValue    :目标字符串长度
*******************************************************************************/
int gsmDecode7bit(const unsigned char* pSrc, char* pDst, int nSrcLength)
{
    int nSrc;        // 源字符串的计数值
    int nDst;        // 目标解码串的计数值
    int nByte;        // 当前正在处理的组内字节的序号,范围是0-6
    unsigned char nLeft;    // 上一字节残余的数据

    // 计数值初始化
    nSrc = 0;
    nDst = 0;
    
    // 组内字节序号和残余数据初始化
    nByte = 0;
    nLeft = 0;

    // 将源数据每7个字节分为一组,解压缩成8个字节
    // 循环该处理过程,直至源数据被处理完
    // 如果分组不到7字节,也能正确处理
    while(nSrc<nSrcLength)
    {
        // 将源字节右边部分与残余数据相加,去掉最高位,得到一个目标解码字节
        *pDst = ((*pSrc << nByte) | nLeft) & 0x7f;

        // 将该字节剩下的左边部分,作为残余数据保存起来
        nLeft = *pSrc >> (7-nByte);

        // 修改目标串的指针和计数值
        pDst++;
        nDst++;

        // 修改字节计数值
        nByte++;

        // 到了一组的最后一个字节
        if(nByte == 7)
        {
            // 额外得到一个目标解码字节
            *pDst = nLeft;

            // 修改目标串的指针和计数值
            pDst++;
            nDst++;

            // 组内字节序号和残余数据初始化
            nByte = 0;
            nLeft = 0;
        }

        // 修改源串的指针和计数值
        pSrc++;
        nSrc++;
    }

    // 输出字符串加个结束符
    *pDst = '\0';

    // 返回目标串长度
    return nDst;
}
/*******************************************************************************
* FunctionName   : int gsmString2Bytes(const char* pSrc, unsigned char* pDst, int nSrcLength)
* Description    : 可打印字符串转换为字节数据
如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}
* EntryParameter : pSrc - 源字符串指针 pDst - 目标数据指针  nSrcLength - 源字符串长度
* ReturnValue    :目标数据长度
*******************************************************************************/
int gsmString2Bytes(const char* pSrc, unsigned char* pDst, int nSrcLength)
{
    int i = 0;
    for ( i = 0; i < nSrcLength; i += 2)
    {
        // 输出高4位
        if ((*pSrc >= '0') && (*pSrc <= '9'))
        {
            *pDst = (*pSrc - '0') << 4;
        }
        else
        {
            *pDst = (*pSrc - 'A' + 10) << 4;
        }

        pSrc++;

        // 输出低4位
        if ((*pSrc>='0') && (*pSrc<='9'))
        {
            *pDst |= *pSrc - '0';
        }
        else
        {
            *pDst |= *pSrc - 'A' + 10;
        }

        pSrc++;
        pDst++;
    }

    // 返回目标数据长度
    return (nSrcLength / 2);
}
/*******************************************************************************
* FunctionName   : int gsmBytes2String(const unsigned char* pSrc, char* pDst, int nSrcLength)
* Description    : 字节数据转换为可打印字符串
如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01"
* EntryParameter : pSrc - 源数据指针 pDst - 目标字符串指针  nSrcLength - 源数据长度
* ReturnValue    :目标字符串长度
*******************************************************************************/
int gsmBytes2String(const unsigned char* pSrc, char* pDst, int nSrcLength)
{
    const char tab[]="0123456789ABCDEF";    // 0x0-0xf的字符查找表
    int i = 0;
    for (i = 0; i < nSrcLength; i++)
    {
        *pDst++ = tab[*pSrc >> 4];        // 输出高4位
        *pDst++ = tab[*pSrc & 0x0f];    // 输出低4位
        pSrc++;
    }

    // 输出字符串加个结束符
    *pDst = '\0';

    // 返回目标字符串长度
    return (nSrcLength * 2);
}
/******************* (C)************END OF FILE********************************/
本人整理而得!!!!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值