1 #ifndef _STR_FUN_H_030802
2 #define _STR_FUN_H_030802
3
4 #include <string>
5 #include <sstream>
6 #include <iostream>
7 #include <algorithm>
8
9 using namespace std;
10
11 class CStrFun
12 {
13 public:
14 CStrFun();
15 virtual ~CStrFun();
16 //把类中的函数都定义成静态函数,这样相当于在编译时就分配了空间,这样不需要实体对象也可以调用泪中的函数了。
17 static void Str2Lower(string &sSource, int nLen);
18 static string itos(long long i)
19 {
20 stringstream s;
21 s << i;
22 return s.str();
23 }
24
25 /* Locate a substring ignoring case
26 * The function returns a value equal or lager than zero,
27 * or -1 if the substring is not found.
28 */
29
30 static string::size_type FindCase(string haystack, string needle);
31 static string::size_type FindCaseFrom(string haystack, string needle, int From);
32
33 static void ReplaceStr(string &str, string srstr, string dsstr);
34 static void EraseStr(string &str, string substr);
35 };
36
37 #endif // end _STR_FUN_H_030802
38
39 /*
40 ostringstream oss<<Dea<<'.'<<pre();
41
42 oss.str();
43 */
1 #include "StrFun.h"
2
3 CStrFun::CStrFun() {
4
5 }
6
7 CStrFun::~CStrFun() {
8
9 }
10
11 void CStrFun::Str2Lower(string& str, int nLen) //将大写字母改写成小写字母
12 {
13 char distance = 'A' - 'a';
14
15 for (int i = 0; i < nLen; i++)
16 if (str[i] >= 'A' && str[i] <= 'Z')
17 str[i] -= distance;
18 }
19
20 bool _nocase_compare(char c1, char c2) //不区分大小写的比较
21 {
22 return toupper(c1) == toupper(c2);
23 }
24
25 string::size_type CStrFun::FindCase(string haystack, string needle) //在haystack中找第一个匹配needle的位置
26 {
27 if (haystack.empty())
28 return string::npos;
29 if (needle.empty())
30 return string::npos;
31
32 string::iterator pos;
33 pos = search(haystack.begin(), haystack.end(), needle.begin(), needle.end(),
34 _nocase_compare);
35
36 if (pos == haystack.end()) {
37 return string::npos;
38 } else {
39 return (pos - haystack.begin());
40 }
41 }
42
43 string::size_type CStrFun::FindCaseFrom(string haystack, string needle,
44 int nFrom) //在haystack中的第n个位置找第一个匹配needle的位置
45 {
46 //assert( haystack.empty() == false );
47 //assert( needle.empty() == false );
48 if (haystack.empty())
49 return string::npos;
50 if (needle.empty())
51 return string::npos;
52
53 string::iterator pos;
54 pos = search(haystack.begin() + nFrom, haystack.end(), needle.begin(),
55 needle.end(), _nocase_compare);
56
57 if (pos == haystack.end()) {
58 return string::npos;
59 } else {
60 return (pos - haystack.begin());
61 }
62 }
63
64 void CStrFun::EraseStr(string &str, string substr) //在str中删除所有出现的substr
65 {
66 if (str.size() == 0 || substr.size() == 0)
67 return;
68
69 string::size_type idx = 0;
70 string::size_type sub_length = substr.length();
71 idx = str.find(substr, idx);
72 while (idx != string::npos) {
73 str.erase(idx, sub_length);
74 idx = str.find(substr, idx);
75 }
76 }
77
78 void CStrFun::ReplaceStr(string&str, string srstr, string dsstr) //将str中的字串替换成dsstr
79 {
80 if (str.size() == 0 || srstr.size() == 0)
81 return;
82
83 string::size_type idx = 0;
84 string::size_type sub_length = srstr.length();
85 idx = str.find(srstr, idx);
86 while (idx != string::npos) {
87 str.replace(idx, sub_length, dsstr);
88
89 if (idx + dsstr.size() > str.size())
90 break;
91
92 idx = str.find(srstr, idx + dsstr.size());
93 }
94 }