查看原文
其他

一些常用的工具函数(附C代码)


点击上方「嵌入式大杂烩」,选择「置顶公众号」第一时间查看编程笔记!

在我们平时的学习、工作中,我们应该多做一些总结归纳,把一些自己学过的,用过的知识,尽量做一些归纳。比如我们做软件方面的工作,我们可以建立自己的一个代码仓库,专门用于保存一些经过验证过的代码,方便下次需要用到的时候可以搬过来,有助于提高我们的开发效率。

下面分享几个常用的工具函数,我们可以把他们统一存放在一个.c文件中,等到我们的工程需要用到的时候直接添加就可以。

1、计算字符串长度

左右滑动查看全部代码>>>

  1. /*

  2. **************************************************************************************

  3. * 函 数 名: str_len

  4. * 功能说明: 计算字符串长度,0是结束符

  5. * 形 参: _str : 缓冲区

  6. * 返 回 值: 无

  7. **************************************************************************************

  8. */

  9. int str_len(char *_str)

  10. {

  11. int len = 0;


  12. while (*_str++) len++;

  13. return len;

  14. }

2、复制字符串

左右滑动查看全部代码>>>

  1. /*

  2. ***************************************************************************************

  3. * 函 数 名: str_cpy

  4. * 功能说明: 复制字符串

  5. * 形 参: tar : 目标缓冲区

  6. * src : 源缓冲区

  7. * 返 回 值: 无

  8. ***************************************************************************************

  9. */

  10. void str_cpy(char *_tar, char *_src)

  11. {

  12. do

  13. {

  14. *_tar++ = *_src;

  15. }

  16. while (*_src++);

  17. }

3、字符串比较

左右滑动查看全部代码>>>

  1. /*

  2. **************************************************************************************

  3. * 函 数 名: str_cmp

  4. * 功能说明: 字符串比较

  5. * 形 参: s1 : 字符串1

  6. * s2 : 字符串2

  7. * 返 回 值: 0 表示相等 非0表示不等

  8. **************************************************************************************

  9. */

  10. int str_cmp(char * s1, char * s2)

  11. {

  12. while ((*s1!=0) && (*s2!=0) && (*s1==*s2))

  13. {

  14. s1++;

  15. s2++;

  16. }

  17. return *s1 - *s2;

  18. }

4、填充缓冲区每个单元为固定值

左右滑动查看全部代码>>>

  1. /*

  2. **************************************************************************************

  3. * 函 数 名: mem_set

  4. * 功能说明: 填充缓冲区每个单元为固定值

  5. * 形 参: _tar : 目标缓冲区;_data : 数据字节;_len : 数据长度

  6. * 返 回 值: 无

  7. **************************************************************************************

  8. */

  9. void mem_set(char *_tar, char _data, int _len)

  10. {

  11. while (_len--)

  12. {

  13. *_tar++ = _data;

  14. }

  15. }

5、将有符号整数转换为ASCII字符串

左右滑动查看全部代码>>>

  1. /*

  2. **************************************************************************************

  3. * 函 数 名: int_to_ascii

  4. * 功能说明: 将整数转换为ASCII数组。支持负数。

  5. * 形 参: _Number : 整数

  6. * _pBuf : 目标缓冲区, 存放转换后的结果。以0结束的字符串。

  7. * _len : ASCII字符个数, 字符串长度

  8. * 返 回 值: 无

  9. **************************************************************************************

  10. */

  11. void int_to_str(int _iNumber, char *_pBuf, unsigned char _len)

  12. {

  13. unsigned char i;

  14. int iTemp;


  15. if (_iNumber < 0) /* 负数 */

  16. {

  17. iTemp = -_iNumber; /* 转为正数 */

  18. }

  19. else

  20. {

  21. iTemp = _iNumber;

  22. }


  23. mem_set(_pBuf, ' ',_len);


  24. /* 将整数转换为ASCII字符串 */

  25. for (i = 0; i < _len; i++)

  26. {

  27. _pBuf[_len - 1 - i] = (iTemp % 10) + '0';

  28. iTemp = iTemp / 10;

  29. if (iTemp == 0)

  30. {

  31. break;

  32. }

  33. }

  34. _pBuf[_len] = 0;


  35. if (_iNumber < 0) /* 负数 */

  36. {

  37. for (i = 0; i < _len; i++)

  38. {

  39. if ((_pBuf[i] == ' ') && (_pBuf[i + 1] != ' '))

  40. {

  41. _pBuf[i] = '-';

  42. break;

  43. }

  44. }

  45. }

  46. }

6、将10进制形式的ASCII码字符串转换成整数

左右滑动查看全部代码>>>

  1. /*

  2. *************************************************************************************

  3. * 函 数 名: str_to_int

  4. * 功能说明: 将ASCII码字符串转换成整数。遇到小数点自动越过。"12.34"转换结果为1234

  5. * 形 参: _pStr :待转换的ASCII码串. 可以以逗号,#或0结束。

  6. * 返 回 值: 二进制整数值

  7. *************************************************************************************

  8. */

  9. int str_to_int(char *_pStr)

  10. {

  11. unsigned char flag;

  12. char *p;

  13. int ulInt;

  14. unsigned char i;

  15. unsigned char ucTemp;


  16. p = _pStr;

  17. if (*p == '-')

  18. {

  19. flag = 1; /* 负数 */

  20. p++;

  21. }

  22. else

  23. {

  24. flag = 0;

  25. }


  26. ulInt = 0;

  27. for (i = 0; i < 15; i++)

  28. {

  29. ucTemp = *p;

  30. if (ucTemp == '.') /* 遇到小数点,自动跳过1个字节 */

  31. {

  32. p++;

  33. ucTemp = *p;

  34. }

  35. if ((ucTemp >= '0') && (ucTemp <= '9'))

  36. {

  37. ulInt = ulInt * 10 + (ucTemp - '0');

  38. p++;

  39. }

  40. else

  41. {

  42. break;

  43. }

  44. }


  45. if (flag == 1)

  46. {

  47. return -ulInt;

  48. }

  49. return ulInt;

  50. }

7、将2字节数组转换为16位无符号整数

左右滑动查看全部代码>>>

  1. /*

  2. **************************************************************************************

  3. * 函 数 名: BEBufToUint16

  4. * 功能说明: 将2字节数组(大端Big Endian次序,高字节在前)转换为16位整数

  5. * 形 参: _pBuf : 数组

  6. * 返 回 值: 16位整数值

  7. *

  8. * 大端(Big Endian)与小端(Little Endian)

  9. **************************************************************************************

  10. */

  11. uint16_t BEBufToUint16(uint8_t *_pBuf)

  12. {

  13. return (((uint16_t)_pBuf[0] << 8) | _pBuf[1]);

  14. }


  15. /*

  16. **************************************************************************************

  17. * 函 数 名: LEBufToUint16

  18. * 功能说明: 将2字节数组(小端Little Endian,低字节在前)转换为16位整数

  19. * 形 参: _pBuf : 数组

  20. * 返 回 值: 16位整数值

  21. **************************************************************************************

  22. */

  23. uint16_t LEBufToUint16(uint8_t *_pBuf)

  24. {

  25. return (((uint16_t)_pBuf[1] << 8) | _pBuf[0]);

  26. }

8、将4字节数组转换为32位整数

左右滑动查看全部代码>>>

  1. /*

  2. **************************************************************************************

  3. * 函 数 名: BEBufToUint32

  4. * 功能说明: 将4字节数组(大端Big Endian次序,高字节在前)转换为32位整数

  5. * 形 参: _pBuf : 数组

  6. * 返 回 值: 32位整数值

  7. *

  8. * 大端(Big Endian)与小端(Little Endian)

  9. **************************************************************************************

  10. */

  11. uint32_t BEBufToUint32(uint8_t *_pBuf)

  12. {

  13. return (((uint32_t)_pBuf[0] << 24) | ((uint32_t)_pBuf[1] << 16) | ((uint32_t)_pBuf[2] << 8) | _pBuf[3]);

  14. }


  15. /*

  16. **************************************************************************************

  17. * 函 数 名: LEBufToUint32

  18. * 功能说明: 将4字节数组(小端Little Endian,低字节在前)转换为32位整数

  19. * 形 参: _pBuf : 数组

  20. * 返 回 值: 32位整数值

  21. **************************************************************************************

  22. */

  23. uint32_t LEBufToUint32(uint8_t *_pBuf)

  24. {

  25. return (((uint32_t)_pBuf[3] << 24) | ((uint32_t)_pBuf[2] << 16) | ((uint32_t)_pBuf[1] << 8) | _pBuf[0]);

  26. }


以上就是今天分享的几个常用的工具函数。可在后台回复关键词: 工具函数,获取相关的.c文件。

猜你喜欢:

【socket应用】基于C语言的天气客户端的实现

【socket笔记】TCP、UDP通信总结

【C语言笔记】联合体怎么用?

【C语言笔记】关于数组的一个陷阱!

《注重这些细节可以提高我们的编程水平

《局部变量、 全局变量、 堆栈、 静态和全局

【Linux笔记】文件的权限

【Linux笔记】Vi/Vim编辑器


我的个人博客:

https://zhengnianli.github.io


查看往期笔记:

聊天界面输入m获取往期笔记目录


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存