不用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********************************/
本人整理而得!!!!!