其中包括:strcpy(char *, char *),strncpy();strcat();strncat();strcmp();strncmp();strchr();strrchr();strlen();

strdup();strspn();strpbrk();strtok(); memset();memcpy();memmove();memcmp();memscan();strstr();
 _strupr_();_strlen_();_strsplit_();_hex2dec_();_str2hex_();_str2dec_();


    1. /*=========================================================================  
    2.   工程名称:C语言  
     
     
        
     
    1. 组成文件:string_lib.c  
    2. 功能描述:常用C库函数的C实现  
    3. 程序分析:  
    4. 维护记录:


    1. =========================================================================*/  
    2.   
    3. char * ___strtok = NULL;  
    4.   
    5.   
    6. char * strcpy(char * dest,const char *src)  
    7. {  
    8. char *tmp = dest;  
    9.   
    10. while ((*dest++ = *src++) != '\0')  
    11. /* nothing */;  
    12. return tmp;  
    13. }  
    14.   
    15.   
    16.   
    17. char * strncpy(char * dest,const char *src,size_t count)  
    18. {  
    19. char *tmp = dest;  
    20.   
    21. while (count-- && (*dest++ = *src++) != '\0')  
    22. /* nothing */;  
    23.   
    24. return tmp;  
    25. }  
    26.   
    27.   
    28.   
    29. char * strcat(char * dest, const char * src)  
    30. {  
    31. char *tmp = dest;  
    32.   
    33. while (*dest)  
    34.         dest++;  
    35. while ((*dest++ = *src++) != '\0')  
    36.         ;  
    37. return tmp;  
    38. }  
    39.   
    40.   
    41.   
    42. char * strncat(char *dest, const char *src, size_t count)  
    43. {  
    44. char *tmp = dest;  
    45.   
    46. if (count)   
    47.     {  
    48. while (*dest)  
    49.             dest++;  
    50. while ((*dest++ = *src++))   
    51.         {  
    52. if (--count == 0)   
    53.             {  
    54. '\0';  
    55. break;  
    56.             }  
    57.         }  
    58.     }  
    59. return tmp;  
    60. }  
    61.   
    62.   
    63. int strcmp(char *s1, char *s2)  
    64. {  
    65. while(*s1 && *s2)  
    66.     {  
    67. if(*s1 - *s2)  
    68. return (*s1 - *s2);  
    69.         s1++;  
    70.         s2++;  
    71.     }  
    72. if(*s1 != 0)  
    73. return 1;  
    74. else  
    75. return -1;  
    76. return 0;  
    77. }  
    78.   
    79.   
    80. int strncmp(char *s1, char *s2, int len)  
    81. {  
    82. while(len--)  
    83.     {  
    84. if(*s1 && *s2)  
    85.         {  
    86. if(*s1 - *s2)  
    87. return (*s1 - *s2);  
    88.             s1++;  
    89.             s2++;  
    90.         }  
    91. else  
    92.         {  
    93. if(*s1 || *s2)  
    94. return(*s1? *s1: *s2);  
    95.         }  
    96.     }  
    97. return 0;  
    98. }  
    99.   
    100.   
    101. char * strchr(const char * s, int c)  
    102. {  
    103. for(; *s != (char) c; ++s)  
    104. if (*s == '\0')  
    105. return NULL;  
    106. return (char *) s;  
    107. }  
    108.   
    109.   
    110. char * strrchr(const char * s, int c)  
    111. {  
    112. const char *p = s + strlen(s);  
    113. do   
    114.        {  
    115. if (*p == (char)c)  
    116. return (char *)p;  
    117.        }   
    118. while (--p >= s);  
    119. return NULL;  
    120. }  
    121.   
    122.   
    123. size_t strlen(const char * s)  
    124. {  
    125. const char *sc;  
    126.   
    127. for (sc = s; *sc != '\0'; ++sc)  
    128. /* nothing */;  
    129. return sc - s;  
    130. }  
    131.   
    132.   
    133. char * strdup(const char *s)  
    134. {  
    135. char *new;  
    136.   
    137. if ( (s == NULL) || ((new = malloc (strlen(s) + 1)) == NULL) )  
    138.      {  
    139. return NULL;  
    140.     }  
    141.   
    142. new, s);  
    143. return new;  
    144. }  
    145.   
    146.   
    147. size_t strspn(const char *s, const char *accept)  
    148. {  
    149. const char *p;  
    150. const char *a;  
    151. size_t count = 0;  
    152.   
    153. for (p = s; *p != '\0'; ++p)   
    154.     {  
    155. for (a = accept; *a != '\0'; ++a)   
    156.         {  
    157. if (*p == *a)  
    158. break;  
    159.         }  
    160. if (*a == '\0')  
    161. return count;  
    162.               
    163.         ++count;  
    164.     }  
    165.   
    166. return count;  
    167. }  
    168.   
    169.   
    170. char * strpbrk(const char * cs,const char * ct)  
    171. {  
    172. const char *sc1,*sc2;  
    173.   
    174. for( sc1 = cs; *sc1 != '\0'; ++sc1)   
    175.     {  
    176. for( sc2 = ct; *sc2 != '\0'; ++sc2)   
    177.         {  
    178. if (*sc1 == *sc2)  
    179. return (char *) sc1;  
    180.         }  
    181.     }  
    182. return NULL;  
    183. }  
    184.   
    185.   
    186. char * strtok(char * s,const char * ct)  
    187. {  
    188. char *sbegin, *send;  
    189.   
    190.     sbegin  = s ? s : ___strtok;  
    191. if (!sbegin)   
    192.     {  
    193. return NULL;  
    194.     }  
    195.     sbegin += strspn(sbegin,ct);  
    196. if (*sbegin == '\0')   
    197.     {  
    198.         ___strtok = NULL;  
    199. return( NULL );  
    200.     }  
    201.     send = strpbrk( sbegin, ct);  
    202. if (send && *send != '\0')  
    203. '\0';  
    204.     ___strtok = send;  
    205. return (sbegin);  
    206. }  
    207.   
    208.   
    209. void * memset(void * s,char c,size_t count)  
    210. {  
    211. char *xs = (char *) s;  
    212.   
    213. while (count--)  
    214.         *xs++ = c;  
    215.   
    216. return s;  
    217. }  
    218.   
    219.   
    220. void * memcpy(void * dest,const void *src,size_t count)  
    221. {  
    222. char *tmp = (char *) dest, *s = (char *) src;  
    223.   
    224. while (count--)  
    225.         *tmp++ = *s++;  
    226.   
    227. return dest;  
    228. }  
    229.   
    230.   
    231. void * memmove(void * dest,const void *src,size_t count)  
    232. {  
    233. char *tmp, *s;  
    234.   
    235. if (dest <= src)   
    236.     {  
    237. char *) dest;  
    238. char *) src;  
    239. while (count--)  
    240.             *tmp++ = *s++;  
    241.     }  
    242. else   
    243.     {  
    244. char *) dest + count;  
    245. char *) src + count;  
    246. while (count--)  
    247.             *--tmp = *--s;  
    248.     }  
    249.   
    250. return dest;  
    251. }  
    252.   
    253.   
    254. int memcmp(const void * cs,const void * ct,size_t count)  
    255. {  
    256. const unsigned char *su1, *su2;  
    257. signed char res = 0;  
    258.   
    259. for( su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)  
    260. if ((res = *su1 - *su2) != 0)  
    261. break;  
    262. return res;  
    263. }  
    264.   
    265.   
    266. /*
    267.  * find the first occurrence of byte 'c', or 1 past the area if none
    268.  */  
    269. void * memscan(void * addr, int c, size_t size)  
    270. {  
    271. char * p = (unsigned char *) addr;  
    272.   
    273. while (size) {  
    274. if (*p == c)  
    275. return (void *) p;  
    276.         p++;  
    277.         size--;  
    278.     }  
    279. return (void *) p;  
    280. }  
    281.   
    282.   
    283. char * strstr(const char * s1,const char * s2)  
    284. {  
    285. int l1, l2;  
    286.   
    287.     l2 = strlen(s2);  
    288. if (!l2)  
    289. return (char *) s1;  
    290.     l1 = strlen(s1);  
    291. while (l1 >= l2)   
    292.     {  
    293.         l1--;  
    294. if (!memcmp(s1,s2,l2))  
    295. return (char *) s1;  
    296.         s1++;  
    297.     }  
    298. return NULL;  
    299. }  
    300.   
    301. //=============================================================  
    302. // 语法格式:    char *_strupr_(char *Str)  
    303. // 实现功能:    将字符串转换为全大写  
    304. // 参数:      Str -   输入字符串首地址  
    305. // 返回值:     输出字符串首地址  
    306. // 注意:      该程序将直接修改原始字符串  
    307. //=============================================================  
    308. char *_strupr_(char *Str)  
    309. {  
    310. char *cp;  
    311.     cp = Str;  
    312. while (*cp != 0)  
    313.     {  
    314. if (*cp >= 'a' && *cp <= 'z' )  
    315.         {  
    316. 'a' - 'A';  
    317.         }  
    318.         cp++;  
    319.     }  
    320. return Str;  
    321. }  
    322.   
    323. //=============================================================  
    324. // 语法格式:    int _strlen_(char *s)  
    325. // 实现功能:    求取字符串长度  
    326. // 参数:      s   -   输入字符串首地址  
    327. // 返回值:     字符串长度  
    328. //=============================================================  
    329. int _strlen_(char *s)  
    330. {  
    331. int i = 0;  
    332. while(*s)  
    333.     {  
    334.         i++;  
    335.         s++;  
    336.     }  
    337. return i;  
    338. }  
    339.   
    340.   
    341. //=============================================================  
    342. // 语法格式:    int _strsplit_(char *sour, char *splstr, char *dest[])  
    343. // 实现功能:    字符串分割  
    344. // 参数:      sour    -   原始字符串首地址  
    345. //              splstr  -   分割字符串  
    346. //              dest[]  -   分割之后的每个字符串的首地址  
    347. // 返回值:     分割之后的字符串数量  
    348. //=============================================================  
    349. int _strsplit_(char *sour, char *splstr, char *dest[])  
    350. {  
    351. int i = 0;  
    352. int len;  
    353. char *cp;  
    354. if(*splstr == 0)  
    355. return 0;  
    356.   
    357.     cp = sour;  
    358.   
    359.     dest[i] = cp;  
    360.     len = _strlen_(splstr);  
    361. while(*sour)  
    362.     {  
    363. if(*sour == *splstr)  
    364.         {  
    365. if(_strncmp_(sour, splstr, _strlen_(splstr)) == 0)  
    366.             {  
    367.                 i++;  
    368.                 sour += len - 1;  
    369.                 *cp++ = 0;  
    370.                 dest[i] = cp;  
    371.             }  
    372.         }  
    373. else cp++;  
    374.        sour++;  
    375.     }  
    376. return (i + 1);  
    377. }  
    378.   
    379. //=============================================================  
    380. // 语法格式:    unsigned int _hex2dec_(unsigned int Binary)  
    381. // 实现功能:    二进制转BCD码(仅转换输入数据的低16bit)  
    382. // 参数:      Binary  -   输入数据  
    383. // 返回值:     BCD码  
    384. //=============================================================  
    385. unsigned int _hex2dec_(unsigned int Binary)  
    386. {  
    387. int ulRet = 0;  
    388.     Binary &= 0xffff;  
    389. while(Binary >= 10000)  
    390.     {  
    391.         ulRet += 10000;  
    392.         Binary -= 10000;  
    393.     }  
    394. while(Binary >= 1000)  
    395.     {  
    396.         ulRet += 0x1000;  
    397.         Binary -= 1000;  
    398.     }  
    399. while(Binary >= 100)  
    400.     {  
    401.         ulRet += 0x0100;  
    402.         Binary -= 100;  
    403.     }  
    404. while(Binary >= 10)  
    405.     {  
    406.         ulRet += 0x0010;  
    407.         Binary -= 10;  
    408.     }  
    409.     ulRet += Binary;  
    410. return (ulRet);  
    411. }  
    412.   
    413. //=============================================================  
    414. // 语法格式:    int _str2hex_(char *s)  
    415. // 实现功能:    将一个字符串转换为十六进制数据  
    416. // 参数:      s   -   输入字符串  
    417. // 返回值:     字符串代表的十六进制数据  
    418. //=============================================================  
    419. int _str2hex_(char *s)  
    420. {  
    421. int Ret = 0;  
    422.     s = _strupr_(s);  
    423. if((s[0] != '0') || (s[1] != 'X'))  
    424. return 0;  
    425.     s += 2;  
    426. while(*s)  
    427.     {  
    428.         Ret <<= 4;  
    429. if((*s >= '0') && (*s <= '9'))  
    430. int)*s - '0');  
    431. else if((*s >= 'A') && (*s <= 'Z'))  
    432. int)*s - 'A' + 0x0a);  
    433. else  
    434. return 0;  
    435.         s++;  
    436.     }  
    437. return Ret;  
    438. }  
    439.   
    440. //=============================================================  
    441. // 语法格式:    int _str2dec_(char *s)  
    442. // 实现功能:    将一个字符串转换为十进制数据  
    443. // 参数:      s   -   输入字符串  
    444. // 返回值:     字符串代表的十进制数据  
    445. //=============================================================  
    446. int _str2dec_(char *s)  
    447. {  
    448. int Ret, Flag = 0;  
    449.     Ret = 0;  
    450. if(*s == '-')  
    451.     {  
    452.         Flag = 1;  
    453.         s++;  
    454.     }  
    455. while(*s)  
    456.     {  
    457. if((*s < '0') || (*s > '9'))  
    458. return 0;  
    459. int)(*s - '0');  
    460.         s++;  
    461.     }  
    462. if(Flag)  
    463.         Ret *= -1;  
    464. return Ret;  
    465. }