_string.c 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. #include "_string.h"
  2. /*******************************************************************************
  3. * @函数名称 strlen
  4. * @函数说明 string长度统计
  5. * @输入参数 需计算字符串首地址
  6. * @输出参数 字符串长度,不包括'\0'
  7. * @返回参数 无
  8. *******************************************************************************/
  9. int _strlen(const char *str)
  10. {
  11. int count=0;
  12. while(*str!='\0')
  13. {
  14. count++;
  15. str++;
  16. }
  17. return count;
  18. }
  19. void _strcpynum(char *dest,const char *src,uint8_t num)
  20. {
  21. while(num--)
  22. {
  23. *dest++=*src++;
  24. }
  25. }
  26. int _strcopy(char *str,const char *value)
  27. {
  28. int count=0;
  29. while(*value!='\0')
  30. {
  31. *str++=*value++;
  32. count++;
  33. }
  34. *str='\0';
  35. return count;
  36. }
  37. char *_strcat(char *dest,const char *src)
  38. {
  39. int len=0,idx=0;
  40. idx=_strlen(dest);
  41. len=idx+_strlen(src)+1;
  42. dest=(char *)realloc(dest,len*sizeof(char));
  43. _strcopy(&dest[idx],src);
  44. return dest;
  45. }
  46. char *_strcatint(char *dest, int num)
  47. {
  48. int len=0,idx=0;
  49. char src[12]={0};
  50. idx=_strlen(dest);
  51. sprintf(src, "%d", num);
  52. len=idx+_strlen(src)+1;
  53. dest=(char *)realloc(dest,len*sizeof(char));
  54. _strcopy(&dest[idx],src);
  55. return dest;
  56. }
  57. //查找字符c在字符串str中第num次出现的位置
  58. int _strfindnum(char *str,char c,uint8_t num)
  59. {
  60. int count=0;
  61. while(*str!='\0')
  62. {
  63. if(*str++==c)
  64. {
  65. num--;
  66. if(num==0)
  67. {
  68. return count;
  69. }
  70. }
  71. count++;
  72. }
  73. return -1;
  74. }
  75. /*******************************************************************************
  76. * @函数名称 _strfind
  77. * @函数说明 查找字符c在字符串str中第一次出现的位置
  78. * @输入参数 需查找字符串首地址
  79. * @输出参数 找到的字符的位置下标
  80. * @返回参数 无
  81. *******************************************************************************/
  82. int _strfind(char *str,char c)
  83. {
  84. int count=0;
  85. while(*str!='\0')
  86. {
  87. if(*str++==c)
  88. {
  89. return count;
  90. }
  91. count++;
  92. }
  93. return -1;
  94. }
  95. /*******************************************************************************
  96. * @函数名称 _strfindchar
  97. * @函数说明 查找字符c在字符串str中第一次出现的位置
  98. * @输入参数 1:参数个数,2:需查找字符串首地址,3:需查找的字符,4:查找长度限制
  99. * @输出参数 找到的字符的位置下标
  100. * @返回参数 无
  101. *******************************************************************************/
  102. int _strfindchar(int count,...)
  103. {
  104. if(count<2 || count>3)
  105. {
  106. return -1;
  107. }
  108. va_list valist;
  109. /* 为 num 个参数初始化 valist */
  110. va_start(valist, count);
  111. char *str=va_arg(valist, char*);
  112. char c = va_arg(valist, int);
  113. int len=0;
  114. if(count==3)
  115. {
  116. len=va_arg(valist, int);
  117. }
  118. /* 清理为 valist 保留的内存 */
  119. va_end(valist);
  120. int idx=0;
  121. while(*str!='\0')
  122. {
  123. if(*str++==c)
  124. {
  125. return idx;
  126. }
  127. if(idx>=len-1)
  128. {
  129. return -1;
  130. }
  131. else{
  132. idx++;
  133. }
  134. }
  135. return -1;
  136. }
  137. /*******************************************************************************
  138. * @函数名称 _strcount
  139. * @函数说明 string长度统计
  140. * @输入参数 需计算字符串首地址
  141. * @输出参数 字符串长度,不包括'\0','\r','\n'
  142. * @返回参数 无
  143. *******************************************************************************/
  144. int _strcount(const char *str)
  145. {
  146. int count=0;
  147. while(*str!='\0' && *str!='\r' && *str!='\n')
  148. {
  149. count++;
  150. str++;
  151. }
  152. return count;
  153. }
  154. /*******************************************************************************
  155. * @函数名称 strCompare
  156. * @函数说明 比较字符串1和字符串2是否相同
  157. * @输入参数 *str1:第一个字符串
  158. *str2:第二个字符串
  159. * @输出参数 相同为0,不同为-1
  160. * @返回参数 无
  161. *******************************************************************************/
  162. int _strCompare(char *str1,const char *str2)
  163. {
  164. const char * p1=str1;
  165. const char * p2=str2;
  166. while(*p1!='\0' || *p2!='\0')
  167. {
  168. if(*p1!=*p2)
  169. {
  170. return -1;
  171. }
  172. p1++;
  173. p2++;
  174. }
  175. return 0;
  176. }
  177. /*******************************************************************************
  178. * @函数名称 strstr
  179. * @函数说明 在字符串1中找字符串2出现的第一次位置
  180. * @输入参数 *str1:第一个字符串
  181. *str2:第二个字符串
  182. * @输出参数 出现的位置
  183. * @返回参数 无
  184. *******************************************************************************/
  185. int _strstr(char *str1,const char *str2)
  186. {
  187. char * p1=str1;
  188. const char * p2=str2;
  189. int size=0;
  190. if(*str1=='\0' || *str2=='\0')
  191. {
  192. return -1;
  193. }
  194. if(_strlen(str1)<_strlen(str2))
  195. {
  196. return -1;
  197. }
  198. while(*str1)
  199. {
  200. p1=str1;
  201. p2=str2;
  202. while(*p1==*p2 && *p1 && *p2)
  203. {
  204. p1++;
  205. p2++;
  206. }
  207. if(*p2=='\0')
  208. {
  209. return size;
  210. }
  211. str1++;
  212. size++;
  213. }
  214. return -1;
  215. }
  216. uint8_t _get_Hex(const char c)
  217. {
  218. uint8_t value=0xFF;
  219. if(c>='0'&&c<='9'){
  220. value=c-'0';
  221. }
  222. else if(c>='A' && c<='F')
  223. {
  224. value=c-55;
  225. }
  226. else if(c>='a' && c<='f')
  227. {
  228. value=c-87;
  229. }
  230. return value;
  231. }
  232. char _get_HexChar(uint8_t hex)
  233. {
  234. switch(hex)
  235. {
  236. case 0:return '0';
  237. case 1:return '1';
  238. case 2:return '2';
  239. case 3:return '3';
  240. case 4:return '4';
  241. case 5:return '5';
  242. case 6:return '6';
  243. case 7:return '7';
  244. case 8:return '8';
  245. case 9:return '9';
  246. case 10:return 'A';
  247. case 11:return 'B';
  248. case 12:return 'C';
  249. case 13:return 'D';
  250. case 14:return 'E';
  251. case 15:return 'F';
  252. default:return '0';
  253. }
  254. }
  255. int _HexToStr(char *data,uint8_t *byte,int size)
  256. {
  257. char temp=0;
  258. for(int i=0;i<size;i++)
  259. {
  260. temp=_get_HexChar(*byte>>4);
  261. *data++=temp;
  262. temp=_get_HexChar(*byte++&0x0F);
  263. *data++=temp;
  264. }
  265. *data=0;
  266. return size*2;
  267. }
  268. int getIndexOfSigns(char ch)
  269. {
  270. if(ch >= '0' && ch <= '9')
  271. {
  272. return ch - '0';
  273. }
  274. if(ch >= 'A' && ch <='F')
  275. {
  276. return ch - 'A' + 10;
  277. }
  278. if(ch >= 'a' && ch <= 'f')
  279. {
  280. return ch - 'a' + 10;
  281. }
  282. return -1;
  283. }
  284. uint32_t _get_HexToDec(char *str)
  285. {
  286. uint32_t sum=0;
  287. int temp=0;
  288. while(*str!=0)
  289. {
  290. temp=getIndexOfSigns(*str);
  291. if(temp==-1)
  292. {
  293. break;
  294. }
  295. sum*=16;
  296. sum+=temp;
  297. str++;
  298. }
  299. return sum;
  300. }
  301. static bool check_number_start(char c)
  302. {
  303. if(c >= '0' && c <= '9')
  304. {
  305. return true;
  306. }
  307. if(c == '-' || c == '+')
  308. {
  309. return true;
  310. }
  311. return false;
  312. }
  313. int check_no_number(char *str)
  314. {
  315. int idx=0;
  316. while(*str >= '0' && *str <= '9')
  317. {
  318. idx++;
  319. str++;
  320. }
  321. return idx;
  322. }
  323. int check_is_number(char *str)
  324. {
  325. int idx=0;
  326. while(*str < '0' || *str > '9')
  327. {
  328. idx++;
  329. str++;
  330. }
  331. return idx;
  332. }
  333. float _my_atof(char *str)
  334. {
  335. float f_num=0.0f;
  336. float decimal=0.0f;
  337. uint8_t decimal_count=0;
  338. bool neg=false;
  339. while(check_number_start(*str)==false)
  340. {
  341. str++;
  342. }
  343. if(*str=='-')
  344. {
  345. neg=true;
  346. str++;
  347. }
  348. while(*str >= '0' && *str <= '9')
  349. {
  350. f_num*=10.0f;
  351. f_num+=(float)_get_Hex(*str++);
  352. }
  353. if(*str=='.')
  354. {
  355. str++;
  356. while(*str >= '0' && *str <= '9')
  357. {
  358. decimal*=10.0f;
  359. decimal+=(float)_get_Hex(*str++);
  360. decimal_count++;
  361. if(decimal_count>6)
  362. {
  363. break;
  364. }
  365. }
  366. while(decimal_count--)
  367. {
  368. decimal/=10.0f;
  369. }
  370. }
  371. f_num=f_num+decimal;
  372. if(neg==true)
  373. {
  374. f_num=0-f_num;
  375. }
  376. return f_num;
  377. }
  378. int _my_atoi(char *str)
  379. {
  380. int i_num=0;
  381. bool neg=false;
  382. while(check_number_start(*str)==false)
  383. {
  384. str++;
  385. }
  386. if(*str=='-')
  387. {
  388. neg=true;
  389. str++;
  390. }
  391. while(*str >= '0' && *str <= '9')
  392. {
  393. i_num*=10;
  394. i_num+=(int)_get_Hex(*str++);
  395. }
  396. if(neg==true)
  397. {
  398. i_num=0-i_num;
  399. }
  400. return i_num;
  401. }
  402. uint32_t _my_atou32(char *str)
  403. {
  404. uint32_t u32_num=0;
  405. while(check_number_start(*str)==false)
  406. {
  407. str++;
  408. }
  409. while(*str >= '0' && *str <= '9')
  410. {
  411. u32_num*=10;
  412. u32_num+=(int)_get_Hex(*str++);
  413. }
  414. return u32_num;
  415. }