找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3427|回复: 11

【C】C语言版的vb字符串函数库

[复制链接]

85

主题

175

回帖

3990

积分

用户组: 超级版主

No. 418

UID
418
精华
14
威望
53 点
宅币
1974 个
贡献
1582 次
宅之契约
0 份
在线时间
252 小时
注册时间
2014-8-9
发表于 2015-7-4 22:31:22 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
最近用C自己写词法分析器
词法分析器的标准写法是构建自动机进行正则匹配
然而我不走寻常路,自己使用字符串函数拆解字符串
因为我的第一次已经给了vb(请大家不要:{:soso_e127:} )
所以vb的字符串函数已经扔不掉了,这次用C重写了vb大多数字符串函数。

文件名叫做:cvbstrfun.h,大家只需包含该头文件即可

  1. /////////////////////////////////////////////////
  2. //                Description:                 //
  3. //            C Style VB Str Func              //
  4. //              Name:cvbstrfun.h               //
  5. //               Auther:Cyycoish               //
  6. //              ID:201506282102A               //
  7. //          (C) 2015 [url]www.0xaa55.com[/url]            //
  8. //            All Rights Reserved.             //
  9. /////////////////////////////////////////////////
  10. #include <locale.h>
  11. #include <wchar.h>
  12. #include <tchar.h>
  13. #include <malloc.h>
  14. #define WCHR wchar_t
  15. //________________________
  16. //|   <Function Table>   |
  17. //|______________________|
  18. //|C Style    |VB Style  |
  19. //|-----------|----------|
  20. //|wslen      |Len       |
  21. //|wsucase    |UCase     |
  22. //|wsleft     |Left      |
  23. //|wsinverse  |StrReverse|
  24. //|wsright    |Right     |
  25. //|wsmid      |Mid       |
  26. //|wsinstr    |InStr     |
  27. //|wsltrim    |LTrim     |
  28. //|wsrtrim    |RTrim     |
  29. //|wsinstrrev |InStrRev  |
  30. //|___________|__________|
  31. int wslen(WCHR* s)
  32. {
  33.         return wcslen(s);
  34. }
  35. void wsucase(WCHR* s)
  36. {
  37.         int i;
  38.         for (i = 0; i <= wcslen(s) - 1; i++)
  39.                 s[i] = towupper(s[i]);
  40.         return;
  41. }
  42. void wslcase(WCHR* s)
  43. {
  44.         int i;
  45.         for (i = 0; i <= wcslen(s) - 1; i++)
  46.                 s[i] = towlower(s[i]);
  47.         return;
  48. }
  49. WCHR* wsleft(WCHR* szTar, int n)
  50. {
  51.         int i;
  52.         WCHR* rtn;
  53.         WCHR tmpWChr[2] = {'\0', '\0'};
  54.         if (n > wcslen(szTar))
  55.                 return L"";
  56.         rtn = (WCHR*)malloc(sizeof(szTar));
  57.         wcscpy(rtn, L"");
  58.         for (i = 0; i <= n - 1; i++)
  59.         {
  60.                 tmpWChr[0] = szTar[i];
  61.                 wcscat(rtn, tmpWChr);
  62.         }
  63.         return rtn;
  64. }
  65. void wsinverse(WCHR* szTar)
  66. {
  67.         int i, j, l;
  68.         WCHR* rtn;
  69.         WCHR tmpWChr[2] = {'\0', '\0'};
  70.         l = wcslen(szTar);
  71.         rtn = (WCHR*)malloc(sizeof(szTar));
  72.         wcscpy(rtn, L"");
  73.         for (i = 0, j = l - 1; i < wcslen(szTar); i++, j--)
  74.         {
  75.                 rtn[j] = szTar[i];
  76.         }
  77.         rtn[i] = '\0';
  78.         wcscpy(szTar, rtn);
  79. }
  80. WCHR* wsright(WCHR* szTar, int n)
  81. {
  82.         int i, j, l;
  83.         WCHR* rtn;
  84.         WCHR tmpWChr[2] = {'\0', '\0'};
  85.         l = wcslen(szTar);
  86.         if (n > l)
  87.                 return L"";
  88.         rtn = (WCHR*)malloc(sizeof(szTar));
  89.         wcscpy(rtn, L"");
  90.         for (i = l - 1, j = 1; j <= n; i--, j++)
  91.         {
  92.                 tmpWChr[0] = szTar[i];
  93.                 wcscat(rtn, tmpWChr);
  94.         }
  95.         wsinverse(rtn);
  96.         return rtn;
  97. }
  98. WCHR* wsmid(WCHR* szTar, int st, int n)
  99. {
  100.         int i;
  101.         WCHR* rtn;
  102.         WCHR tmpWChr[2] = {'\0', '\0'};
  103.         if ((st - 1 + n) > wcslen(szTar))
  104.                 return L"";
  105.         rtn = (WCHR*)malloc(sizeof(szTar));
  106.         wcscpy(rtn, L"");

  107.         for (i = st - 1; i <= st + n - 2; i++)
  108.         {
  109.                 tmpWChr[0] = szTar[i];
  110.                 wcscat(rtn, tmpWChr);
  111.         }
  112.         return rtn;
  113. }
  114. int wsinstr(WCHR* szTar, WCHR* szCmp, int st)
  115. {
  116.         int i;
  117.         if (st >= wcslen(szTar) - wcslen(szCmp))
  118.                 return -1;
  119.         for (i = st; i <= wcslen(szTar); i++)
  120.         {
  121.                 if (!wcscmp(szCmp, wsmid(szTar, i, wcslen(szCmp))))
  122.                         return i;
  123.         }
  124.         return -1;
  125. }
  126. void wsltrim(WCHR* szTar)
  127. {
  128.         int i;
  129.         int b = 0;
  130.         WCHR* rtn;
  131.         WCHR tmpWChr[2] = {'\0', '\0'};
  132.         rtn = (WCHR*)malloc(sizeof(szTar));
  133.         wcscpy(rtn, L"");
  134.         for (i = 0; i < wcslen(szTar); i++)
  135.         {
  136.                 tmpWChr[0] = szTar[i];
  137.                 if (tmpWChr[0] != ' ' || b != 0)
  138.                 {
  139.                         wcscat(rtn, tmpWChr);
  140.                         if (tmpWChr[0] != ' ' && b == 0)
  141.                                 b = !(b);
  142.                 }
  143.         }
  144.         wcscpy(szTar, rtn);
  145. }
  146. void wsrtrim(WCHR* szTar)
  147. {
  148.         int i, j, l;
  149.         int b = 0;
  150.         WCHR* rtn;
  151.         WCHR tmpWChr[2] = {'\0', '\0'};
  152.         l = wcslen(szTar);
  153.         rtn = (WCHR*)malloc(sizeof(szTar));
  154.         wcscpy(rtn, L"");
  155.         for (i = l - 1, j = 1; j < l; i--, j++)
  156.         {
  157.                 tmpWChr[0] = szTar[i];
  158.                 if (tmpWChr[0] != ' ' || b != 0)
  159.                 {
  160.                         wcscat(rtn, tmpWChr);
  161.                         if (tmpWChr[0] != ' ' && b == 0)
  162.                                 b = !(b);
  163.                 }
  164.         }
  165.         wsinverse(rtn);
  166.         wcscpy(szTar, rtn);
  167. }
  168. int wsinstrrev(WCHR* szTar, WCHR* szCmp, int st)
  169. {
  170.         int i;
  171.         WCHR* s1, * s2;
  172.         s1 = (WCHR*)malloc(sizeof(szTar));
  173.         s2 = (WCHR*)malloc(sizeof(szCmp));
  174.         wcscpy(s1, szTar); wcscpy(s2, szCmp);
  175.         wsinverse(s1); wsinverse(s2);
  176.         if (st >= wcslen(szTar) - wcslen(szCmp))
  177.                 return -1;
  178.         for (i = st; i < wcslen(szTar); i++)
  179.         {
  180.                 if (!wcscmp(s2, wsmid(s1, i, wcslen(s2))))
  181.                 {
  182.                         return wcslen(szTar) - i + 1;
  183.                 }
  184.         }
  185.         return -1;
  186. }
复制代码

还有一点 大家需要注意的是:
因为是宽字符,所以main函数调用该头文件,使用函数时要locate一下,具体做法如下:
  1. #include <stdio.h>
  2. #include "cvbstrfun.h"

  3. int _tmain(int argc, wchar_t* argv[])
  4. {
  5.        
  6.         WCHR str[] = {L"abcdefg"};
  7.         //int a;
  8.         setlocale(LC_CTYPE, ""); //就是这个关键的一句,不加显示不了中文
  9.         //wcscpy(str, wsleft(str, 2));
  10.         //wsinverse(str);
  11.         //wcscpy(str, wsright(str, 3));
  12.         //wcscpy(str, wsmid(str, 3, 2));
  13.         //wsucase(str);
  14.         //wsrtrim(str);
  15.         //a = wsinstrrev(L"aabccccc", L"b", 1);
  16.         //wprintf(L""%s"\n", str);
  17.         //printf("\n%d\n", a);
  18.        
  19.         return 0;
  20. }
复制代码

本帖被以下淘专辑推荐:

In the beginning I was not the best.
And the world was also not the best.
But I still know that I am who I am.
Because I think that it is good.
I have been working hard.
I have been keeping growth with the world.
And it was so.
回复

使用道具 举报

1112

主题

1653

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
245
威望
744 点
宅币
24267 个
贡献
46222 次
宅之契约
0 份
在线时间
2299 小时
注册时间
2014-1-26
发表于 2015-7-5 12:45:06 来自手机 | 显示全部楼层
哪天你再实现一下strstr strcpy strchr strcmp sprintf等函数的VB版本吧。
嘛。我开玩笑的。不必为此浪费时间哦。
回复 赞! 靠!

使用道具 举报

0

主题

76

回帖

6758

积分

用户组: 真·技术宅

UID
604
精华
0
威望
2 点
宅币
825 个
贡献
5853 次
宅之契约
0 份
在线时间
101 小时
注册时间
2014-12-20
发表于 2015-7-7 16:22:02 | 显示全部楼层
wsinverse 函数里的 rtn 是忘记释放的节奏?
回复 赞! 靠!

使用道具 举报

85

主题

175

回帖

3990

积分

用户组: 超级版主

No. 418

UID
418
精华
14
威望
53 点
宅币
1974 个
贡献
1582 次
宅之契约
0 份
在线时间
252 小时
注册时间
2014-8-9
 楼主| 发表于 2015-7-7 22:34:54 | 显示全部楼层
0x01810 发表于 2015-7-7 16:22
wsinverse 函数里的 rtn 是忘记释放的节奏?

这个rtn不可以释放啊
wcscpy是直接传地址的
rtn free掉了以后,szTar就木有了
In the beginning I was not the best.
And the world was also not the best.
But I still know that I am who I am.
Because I think that it is good.
I have been working hard.
I have been keeping growth with the world.
And it was so.
回复 赞! 靠!

使用道具 举报

85

主题

175

回帖

3990

积分

用户组: 超级版主

No. 418

UID
418
精华
14
威望
53 点
宅币
1974 个
贡献
1582 次
宅之契约
0 份
在线时间
252 小时
注册时间
2014-8-9
 楼主| 发表于 2015-7-7 22:36:30 | 显示全部楼层
重写了一下wsinstrrev:
  1. int wsinstrrev(const WCHR* szTar, const WCHR* szCmp, int st)
  2. {
  3.         int i;
  4.         for (i = wcslen(szTar) - wcslen(szCmp) + 1; i >= st; i--)
  5.                 if (!wcscmp(szCmp, wsmid(szTar, i, wcslen(szCmp))))
  6.                         return i;
  7.         return -1;
  8. }
复制代码
In the beginning I was not the best.
And the world was also not the best.
But I still know that I am who I am.
Because I think that it is good.
I have been working hard.
I have been keeping growth with the world.
And it was so.
回复 赞! 靠!

使用道具 举报

0

主题

76

回帖

6758

积分

用户组: 真·技术宅

UID
604
精华
0
威望
2 点
宅币
825 个
贡献
5853 次
宅之契约
0 份
在线时间
101 小时
注册时间
2014-12-20
发表于 2015-7-8 14:41:35 | 显示全部楼层
cyycoish 发表于 2015-7-7 22:34
这个rtn不可以释放啊
wcscpy是直接传地址的
rtn free掉了以后,szTar就木有了 ...

不是应该这样写吗:

  1. void wsinverse(WCHAR* szTar)
  2. {
  3.         int i, j, l;
  4.         WCHAR* rtn;
  5.         l = wcslen(szTar);
  6.         rtn = (WCHAR*)malloc(sizeof(szTar));
  7.         wcscpy(rtn, L"");
  8.         for (i = 0, j = l - 1; i < wcslen(szTar); i++, j--)
  9.         {
  10.                 rtn[j] = szTar[i];
  11.         }
  12.         rtn[i] = '\0';
  13.         wcscpy(szTar, rtn);
  14.         free(rtn);
  15. }
复制代码
回复 赞! 靠!

使用道具 举报

85

主题

175

回帖

3990

积分

用户组: 超级版主

No. 418

UID
418
精华
14
威望
53 点
宅币
1974 个
贡献
1582 次
宅之契约
0 份
在线时间
252 小时
注册时间
2014-8-9
 楼主| 发表于 2015-7-8 17:14:03 | 显示全部楼层
0x01810 发表于 2015-7-8 14:41
不是应该这样写吗:
[code]
void wsinverse(WCHAR* szTar)

wsinverse是这样声明的:void wsinverse(WCHAR* szTar) 如果调用wsinverse,函数修改的是原本传入的那个字符串。然后,在函数内部,有这么一句:wcscpy(szTar, rtn);。咱们来看一下wcscpy的声明:wchar_t * __cdecl wcscpy(wchar_t * _Dest, const wchar_t * _Source)。这样一来rtn所指向的地址就完完全全给了szTar,换句话说,刚刚传入的那个字符串的内存地址变成了malloc出来的rtn所指向的地址。如果这时候free,相当于free了传入字符串的地址。打个简单的比方吧:我借了你的作业,作业本到手以后,因为某种原因,我不小心把你的字全擦了。后来呢,我又叫A5帮你重写了一遍。这时候,若要擦掉A5写的的作业,就等于擦掉了你的本子上所有的内容,你也就拿着一个空本子了。@0xAA55 <=A5惨遭背锅
In the beginning I was not the best.
And the world was also not the best.
But I still know that I am who I am.
Because I think that it is good.
I have been working hard.
I have been keeping growth with the world.
And it was so.
回复 赞! 靠!

使用道具 举报

85

主题

175

回帖

3990

积分

用户组: 超级版主

No. 418

UID
418
精华
14
威望
53 点
宅币
1974 个
贡献
1582 次
宅之契约
0 份
在线时间
252 小时
注册时间
2014-8-9
 楼主| 发表于 2015-7-8 17:27:44 | 显示全部楼层
呐,最新版本:
  1. #include <locale.h>
  2. #include <wchar.h>
  3. #include <tchar.h>
  4. #include <malloc.h>
  5. #define WCHR wchar_t
  6. //String Functions
  7. int wslen(const WCHR* s)
  8. {
  9.         return wcslen(s);
  10. }
  11. void wsucase(WCHR* s)
  12. {
  13.         int i;
  14.         for (i = 0; i <= wcslen(s) - 1; i++)
  15.                 s[i] = towupper(s[i]);
  16.         return;
  17. }
  18. void wslcase(WCHR* s)
  19. {
  20.         int i;
  21.         for (i = 0; i <= wcslen(s) - 1; i++)
  22.                 s[i] = towlower(s[i]);
  23.         return;
  24. }
  25. WCHR* wsleft(const WCHR* szTar, int n)
  26. {
  27.         int i;
  28.         WCHR* rtn;
  29.         WCHR tmpWChr[2] = {'\0', '\0'};
  30.         if (n > wcslen(szTar))
  31.                 return L"";
  32.         rtn = (WCHR*)malloc(sizeof(szTar));
  33.         wcscpy(rtn, L"");
  34.         for (i = 0; i <= n - 1; i++)
  35.         {
  36.                 tmpWChr[0] = szTar[i];
  37.                 wcscat(rtn, tmpWChr);
  38.         }
  39.         return rtn;
  40. }
  41. void wsinverse(WCHR* szTar)
  42. {
  43.         int i, j, k;
  44.         WCHR* rtn;
  45.         WCHR tmpWChr[2] = {'\0', '\0'};
  46.         k = wcslen(szTar);
  47.         rtn = (WCHR*)malloc(sizeof(szTar));
  48.         wcscpy(rtn, L"");
  49.         for (i = 0, j = k - 1; i < wcslen(szTar); i++, j--)
  50.         {
  51.                 rtn[j] = szTar[i];
  52.         }
  53.         rtn[i] = '\0';
  54.         wcscpy(szTar, rtn);
  55. }
  56. WCHR* wsright(const WCHR* szTar, int n)
  57. {
  58.         int i, j, l;
  59.         WCHR* rtn;
  60.         WCHR tmpWChr[2] = {'\0', '\0'};
  61.         l = wcslen(szTar);
  62.         if (n > l)
  63.                 return L"";
  64.         rtn = (WCHR*)malloc(sizeof(szTar));
  65.         wcscpy(rtn, L"");
  66.         for (i = l - 1, j = 1; j <= n; i--, j++)
  67.         {
  68.                 tmpWChr[0] = szTar[i];
  69.                 wcscat(rtn, tmpWChr);
  70.         }
  71.         wsinverse(rtn);
  72.         return rtn;
  73. }
  74. WCHR* wsmid(const WCHR* szTar, int st, int n)
  75. {
  76.         int i;
  77.         WCHR* rtn;
  78.         WCHR tmpWChr[2] = {'\0', '\0'};
  79.         if ((st - 1 + n) > wcslen(szTar))
  80.                 return L"";
  81.         rtn = (WCHR*)malloc(sizeof(szTar));
  82.         wcscpy(rtn, L"");

  83.         for (i = st - 1; i <= st + n - 2; i++)
  84.         {
  85.                 tmpWChr[0] = szTar[i];
  86.                 wcscat(rtn, tmpWChr);
  87.         }
  88.         return rtn;
  89. }
  90. int wsinstr(const WCHR* szTar, const WCHR* szCmp, int st)
  91. {
  92.         int i;
  93.         if (st >= wcslen(szTar) - wcslen(szCmp))
  94.                 return -1;
  95.         for (i = st; i <= wcslen(szTar); i++)
  96.         {
  97.                 if (!wcscmp(szCmp, wsmid(szTar, i, wcslen(szCmp))))
  98.                         return i;
  99.         }
  100.         return -1;
  101. }
  102. void wsltrim(WCHR* szTar)
  103. {
  104.         int i;
  105.         int b = 0;
  106.         WCHR* rtn;
  107.         WCHR tmpWChr[2] = {'\0', '\0'};
  108.         rtn = (WCHR*)malloc(sizeof(szTar));
  109.         wcscpy(rtn, L"");
  110.         for (i = 0; i < wcslen(szTar); i++)
  111.         {
  112.                 tmpWChr[0] = szTar[i];
  113.                 if (tmpWChr[0] != ' ' || b != 0)
  114.                 {
  115.                         wcscat(rtn, tmpWChr);
  116.                         if (tmpWChr[0] != ' ' && b == 0)
  117.                                 b = !(b);
  118.                 }
  119.         }
  120.         wcscpy(szTar, rtn);
  121. }
  122. void wsrtrim(WCHR* szTar)
  123. {
  124.         int i, j, l;
  125.         int b = 0;
  126.         WCHR* rtn;
  127.         WCHR tmpWChr[2] = {'\0', '\0'};
  128.         l = wcslen(szTar);
  129.         rtn = (WCHR*)malloc(sizeof(szTar));
  130.         wcscpy(rtn, L"");
  131.         for (i = l - 1, j = 1; j < l; i--, j++)
  132.         {
  133.                 tmpWChr[0] = szTar[i];
  134.                 if (tmpWChr[0] != ' ' || b != 0)
  135.                 {
  136.                         wcscat(rtn, tmpWChr);
  137.                         if (tmpWChr[0] != ' ' && b == 0)
  138.                                 b = !(b);
  139.                 }
  140.         }
  141.         wsinverse(rtn);
  142.         wcscpy(szTar, rtn);
  143. }
  144. int wsinstrrev(const WCHR* szTar, const WCHR* szCmp, int st)
  145. {
  146.         int i;
  147.         for (i = wcslen(szTar) - wcslen(szCmp) + 1; i >= st; i--)
  148.                 if (!wcscmp(szCmp, wsmid(szTar, i, wcslen(szCmp))))
  149.                         return i;
  150.         return -1;
  151. }
  152. //End String Functions
复制代码
In the beginning I was not the best.
And the world was also not the best.
But I still know that I am who I am.
Because I think that it is good.
I have been working hard.
I have been keeping growth with the world.
And it was so.
回复 赞! 靠!

使用道具 举报

1112

主题

1653

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
245
威望
744 点
宅币
24267 个
贡献
46222 次
宅之契约
0 份
在线时间
2299 小时
注册时间
2014-1-26
发表于 2015-7-8 18:54:54 | 显示全部楼层
cyycoish 发表于 2015-7-8 17:27
呐,最新版本:
[code]#include
#include

@0x01810 说得对。那个地址确实要释放。你只是分配了一块内存用于临时存储翻转后的字符串而已。用完后,你需要释放这块内存。
回复 赞! 靠!

使用道具 举报

85

主题

175

回帖

3990

积分

用户组: 超级版主

No. 418

UID
418
精华
14
威望
53 点
宅币
1974 个
贡献
1582 次
宅之契约
0 份
在线时间
252 小时
注册时间
2014-8-9
 楼主| 发表于 2015-7-8 20:20:52 | 显示全部楼层
0xAA55 发表于 2015-7-8 18:54
@0x01810 说得对。那个地址确实要释放。你只是分配了一块内存用于临时存储翻转后的字符串而已。用完后, ...

但是。。。释放后就。。。。
捕获.PNG
In the beginning I was not the best.
And the world was also not the best.
But I still know that I am who I am.
Because I think that it is good.
I have been working hard.
I have been keeping growth with the world.
And it was so.
回复 赞! 靠!

使用道具 举报

1112

主题

1653

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
245
威望
744 点
宅币
24267 个
贡献
46222 次
宅之契约
0 份
在线时间
2299 小时
注册时间
2014-1-26
发表于 2015-7-8 20:24:53 | 显示全部楼层
cyycoish 发表于 2015-7-8 20:20
但是。。。释放后就。。。。

rtn = (WCHR*)malloc(sizeof(szTar));
其中szTar是个指针,也就是说,sizeof(szTar)的值,x86的时候是4,x64的时候是8,然后它的前后有malloc的一些数据,被你来个缓冲区溢出,破坏了。自然,free也不能成功。
这不是VB,这是C,你需要把sizeof(szTar)改成字符串的实际长度。
回复 赞! 靠!

使用道具 举报

85

主题

175

回帖

3990

积分

用户组: 超级版主

No. 418

UID
418
精华
14
威望
53 点
宅币
1974 个
贡献
1582 次
宅之契约
0 份
在线时间
252 小时
注册时间
2014-8-9
 楼主| 发表于 2015-7-8 21:42:31 | 显示全部楼层
终于,在站长的指导下完成了50%,这里要特别感谢A5站长@0xAA55
算是一次阶段性的成功:
  1. /////////////////////////////////////////////////
  2. //                Description:                 //
  3. //              String Functions               //
  4. //                Name:StrFun.h                //
  5. //              Auther:Cosh Cage               //
  6. //              ID:201507082140C               //
  7. /////////////////////////////////////////////////
  8. #include <locale.h>
  9. #include <wchar.h>
  10. #include <tchar.h>
  11. #include <malloc.h>

  12. #define WCHR wchar_t
  13. /*
  14. int   wslen     (const WCHR* s);
  15. void  wsucase   (WCHR* s);
  16. void  wslcase   (WCHR* s);
  17. WCHR* wsleft    (const WCHR* szTar, int n);
  18. void  wsinverse (WCHR* szTar);
  19. WCHR* wsright   (const WCHR* szTar, int n);
  20. WCHR* wsmid     (const WCHR* szTar, int st, int n);
  21. int   wsinstr   (const WCHR* szTar, const WCHR* szCmp, int st);
  22. void  wsltrim   (WCHR* szTar);
  23. void  wsrtrim   (WCHR* szTar);
  24. int   wsinstrrev(const WCHR* szTar, const WCHR* szCmp, int st);
  25. */
  26. //String Functions
  27. int wslen(const WCHR* s)
  28. {
  29.         return wcslen(s);
  30. }
  31. void wsucase(WCHR* s)
  32. {
  33.         int i;
  34.         for (i = 0; i <= wcslen(s) - 1; i++)
  35.                 s[i] = towupper(s[i]);
  36.         return;
  37. }
  38. void wslcase(WCHR* s)
  39. {
  40.         int i;
  41.         for (i = 0; i <= wcslen(s) - 1; i++)
  42.                 s[i] = towlower(s[i]);
  43.         return;
  44. }
  45. WCHR* wsleft(const WCHR* szTar, int n)
  46. {
  47.         int i;
  48.         WCHR* rtn;
  49.         WCHR tmpWChr[2] = {'\0', '\0'};
  50.         if (n > wcslen(szTar))
  51.                 return L"";
  52.         rtn = (WCHR*)malloc(sizeof(WCHR) * (wcslen(szTar) + 1));
  53.         wcscpy(rtn, L"");
  54.         for (i = 0; i <= n - 1; i++)
  55.         {
  56.                 tmpWChr[0] = szTar[i];
  57.                 wcscat(rtn, tmpWChr);
  58.         }
  59.         return rtn;
  60. }
  61. void wsinverse(WCHR* szTar)
  62. {
  63.         int i, j, k;
  64.         WCHR* rtn;
  65.         k = wcslen(szTar);
  66.         rtn = (WCHR*)malloc(sizeof(WCHR) * (k + 1));
  67.         for (i = 0, j = k - 1; i < wcslen(szTar); i++, j--)
  68.         {
  69.                 rtn[j] = szTar[i];
  70.         }
  71.         rtn[i] = '\0';
  72.         wcscpy(szTar, rtn);
  73.         free(rtn);
  74. }
  75. WCHR* wsright(const WCHR* szTar, int n)
  76. {
  77.         int i, j, k;
  78.         WCHR* rtn;
  79.         WCHR tmpWChr[2] = {'\0', '\0'};
  80.         k = wcslen(szTar);
  81.         if (n > k)
  82.                 return L"";
  83.         rtn = (WCHR*)malloc(sizeof(WCHR) * (k + 1));
  84.         wcscpy(rtn, L"");
  85.         for (i = k - 1, j = 1; j <= n; i--, j++)
  86.         {
  87.                 tmpWChr[0] = szTar[i];
  88.                 wcscat(rtn, tmpWChr);
  89.         }
  90.         wsinverse(rtn);
  91.         return rtn;
  92. }
  93. WCHR* wsmid(const WCHR* szTar, int st, int n)
  94. {
  95.         int i;
  96.         WCHR* rtn;
  97.         WCHR tmpWChr[2] = {'\0', '\0'};
  98.         if ((st - 1 + n) > wcslen(szTar))
  99.                 return L"";
  100.         rtn = (WCHR*)malloc(sizeof(WCHR) * (wcslen(szTar) + 1));
  101.         wcscpy(rtn, L"");

  102.         for (i = st - 1; i <= st + n - 2; i++)
  103.         {
  104.                 tmpWChr[0] = szTar[i];
  105.                 wcscat(rtn, tmpWChr);
  106.         }
  107.         return rtn;
  108. }
  109. int wsinstr(const WCHR* szTar, const WCHR* szCmp, int st)
  110. {
  111.         int i;
  112.         if (st >= wcslen(szTar) - wcslen(szCmp))
  113.                 return -1;
  114.         for (i = st; i <= wcslen(szTar); i++)
  115.         {
  116.                 if (!wcscmp(szCmp, wsmid(szTar, i, wcslen(szCmp))))
  117.                         return i;
  118.         }
  119.         return -1;
  120. }
  121. void wsltrim(WCHR* szTar)
  122. {
  123.         int i;
  124.         int b = 0;
  125.         WCHR* rtn;
  126.         WCHR tmpWChr[2] = {'\0', '\0'};
  127.         rtn = (WCHR*)malloc(sizeof(WCHR) * (wcslen(szTar) + 1));
  128.         wcscpy(rtn, L"");
  129.         for (i = 0; i < wcslen(szTar); i++)
  130.         {
  131.                 tmpWChr[0] = szTar[i];
  132.                 if (tmpWChr[0] != ' ' || b != 0)
  133.                 {
  134.                         wcscat(rtn, tmpWChr);
  135.                         if (tmpWChr[0] != ' ' && b == 0)
  136.                                 b = !(b);
  137.                 }
  138.         }
  139.         wcscpy(szTar, rtn);
  140.         free(rtn);
  141. }
  142. void wsrtrim(WCHR* szTar)
  143. {
  144.         int i, j, k;
  145.         int b = 0;
  146.         WCHR* rtn;
  147.         WCHR tmpWChr[2] = {'\0', '\0'};
  148.         k = wcslen(szTar);
  149.         rtn = (WCHR*)malloc(sizeof(WCHR) * (k + 1));
  150.         wcscpy(rtn, L"");
  151.         for (i = k - 1, j = 0; j < k; i--, j++)
  152.         {
  153.                 tmpWChr[0] = szTar[i];
  154.                 if (tmpWChr[0] != ' ' || b != 0)
  155.                 {
  156.                         wcscat(rtn, tmpWChr);
  157.                         if (tmpWChr[0] != ' ' && b == 0)
  158.                                 b = !(b);
  159.                 }
  160.         }
  161.         wsinverse(rtn);
  162.         wcscpy(szTar, rtn);
  163.         free(rtn);
  164. }
  165. int wsinstrrev(const WCHR* szTar, const WCHR* szCmp, int st)
  166. {
  167.         int i;
  168.         for (i = wcslen(szTar) - wcslen(szCmp) + 1; i >= st; i--)
  169.                 if (!wcscmp(szCmp, wsmid(szTar, i, wcslen(szCmp))))
  170.                         return i;
  171.         return -1;
  172. }
  173. //End String Functions
复制代码
In the beginning I was not the best.
And the world was also not the best.
But I still know that I am who I am.
Because I think that it is good.
I have been working hard.
I have been keeping growth with the world.
And it was so.
回复 赞! 靠!

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-5-6 09:42 , Processed in 0.042553 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表