string.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. #include "string.h"
  2. #include "../kernel/debug.h"
  3. #include "../kernel/global.h"
  4. // 函数: _memset
  5. // 作用: 将dst_起始的size个字节设置为value
  6. // 参数: dst_ 为目标地址, value 为设置的值, size 为设置的字节数
  7. // 返回: 无
  8. void _memset(void *dst_, uint8_t value, uint32_t size)
  9. {
  10. ASSERT(dst_ != NULL);
  11. uint8_t *dst = (uint8_t *)dst_;
  12. while (size--)
  13. {
  14. *dst++ = value;
  15. }
  16. }
  17. // 函数: _memcpy
  18. // 作用: 将src_起始的size个字节复制到dst_起始地址
  19. // 参数: dst_ 为目标地址, src_ 为源地址, size 为复制的字节数
  20. // 返回: 无
  21. void _memcpy(void *dst_, const void *src_, uint32_t size)
  22. {
  23. ASSERT(dst_ != NULL && src_ != NULL);
  24. uint8_t *dst = (uint8_t *)dst_;
  25. const uint8_t *src = (const uint8_t *)src_;
  26. while (size--)
  27. {
  28. *dst++ = *src++;
  29. }
  30. }
  31. // 函数: _memcmp
  32. // 作用: 比较两个内存区域的内容
  33. // 参数: a_ 为比较的地址1, b_ 为比较的地址2, size 为比较的字节数
  34. // 返回: 相等返回0, a_大于b_返回1, a_小于b_返回-1
  35. int8_t _memcmp(const void *a_, const void *b_, uint32_t size)
  36. {
  37. const char *a = a_;
  38. const char *b = b_;
  39. ASSERT(a != NULL && b != NULL);
  40. while (size--)
  41. {
  42. if (*a != *b)
  43. {
  44. return *a > *b ? 1 : -1;
  45. }
  46. a++;
  47. b++;
  48. }
  49. return 0;
  50. }
  51. // 函数: _strcpy
  52. // 作用: 将字符串从src_复制到dst_
  53. // 参数: dst_ 为目标地址, src_ 为源地址
  54. // 返回: 目标地址
  55. char *_strcpy(char *dst_, const char *src_)
  56. {
  57. ASSERT(dst_ != NULL && src_ != NULL);
  58. char *r = dst_; // 用来返回目标地址
  59. while ((*dst_++ = *src_++))
  60. ;
  61. return r;
  62. }
  63. // 函数: _strlen
  64. // 作用: 返回字符串的长度
  65. // 参数: str 为字符串
  66. // 返回: 字符串的长度
  67. uint32_t _strlen(const char *str)
  68. {
  69. ASSERT(str != NULL);
  70. const char *p = str;
  71. while (*p++)
  72. ;
  73. return (uint32_t)(p - str - 1);
  74. }
  75. // 函数: _strcmp
  76. // 作用: 比较两个字符串
  77. // 参数: a_ 为比较的字符串1, b_ 为比较的字符串2
  78. // 返回: 相等返回0, a_大于b_返回1, a_小于b_返回-1
  79. int8_t _strcmp(const char *a_, const char *b_)
  80. {
  81. ASSERT(a_ != NULL && b_ != NULL);
  82. const char *a = a_;
  83. const char *b = b_;
  84. while (*a != 0 && *a == *b)
  85. {
  86. a++;
  87. b++;
  88. }
  89. return *a < *b ? -1 : *a > *b;
  90. }
  91. // 函数: _strchr
  92. // 作用: 在字符串中查找字符
  93. // 参数: str 为字符串, ch 为要查找的字符
  94. // 返回: 找到返回地址, 未找到返回NULL
  95. char *_strchr(const char *str, const uint8_t ch)
  96. {
  97. ASSERT(str != NULL);
  98. while (*str != 0)
  99. {
  100. if (*str == ch)
  101. {
  102. return (char *)str;
  103. }
  104. str++;
  105. }
  106. return NULL;
  107. }
  108. // 函数: _strrchr
  109. // 作用: 在字符串中查找字符(从后往前)
  110. // 参数: str 为字符串, ch 为要查找的字符
  111. // 返回: 找到返回地址, 未找到返回NULL
  112. char *_strrchr(const char *str, const uint8_t ch)
  113. {
  114. ASSERT(str != NULL);
  115. const char *last_char = NULL;
  116. // 从前往后查找字符,若存在 ch 字符,则将其地址赋值给 last_char,last_char 为最后一个 ch 字符的地址
  117. while (*str != 0)
  118. {
  119. if (*str == ch)
  120. {
  121. last_char = str;
  122. }
  123. str++;
  124. }
  125. return (char *)last_char;
  126. }
  127. // 函数: _strcat
  128. // 作用: 将字符串src_连接到dst_后
  129. // 参数: dst_ 为目标地址, src_ 为源地址
  130. // 返回: 目标地址(连接后的字符串)
  131. char *_strcat(char *dst_, const char *src_)
  132. {
  133. ASSERT(dst_ != NULL && src_ != NULL);
  134. char *str = dst_;
  135. while (*str++)
  136. ;
  137. --str;
  138. while ((*str++ = *src_++))
  139. ;
  140. return dst_;
  141. }
  142. // 函数: _strchrs
  143. // 作用: 在字符串中查找字符出现的次数
  144. // 参数: str 为字符串, ch 为要查找的字符
  145. // 返回: 字符出现的次数
  146. uint32_t _strchrs(const char *str, uint8_t ch)
  147. {
  148. ASSERT(str != NULL);
  149. uint32_t ch_cnt = 0;
  150. while (*str != 0)
  151. {
  152. if (*str == ch)
  153. {
  154. ch_cnt++;
  155. }
  156. str++;
  157. }
  158. return ch_cnt;
  159. }