青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-3  評論-5  文章-13  trackbacks-0
--------------------------------------------------------------------------------
標(biāo)題: String 替換函數(shù)源碼
作者: 葉飛虎
日期: 2010.03.15
--------------------------------------------------------------------------------
  1 /* 頭文件(.h) */
  2 
  3 // 在 AStr 中查找 AOld 串, 并使用 ANew 替換
  4 // 注: SameStr(AOld, ANew, true) 必須為 false, 內(nèi)部不檢查是否相同
  5 // 如: StringReplace("aabbccddbbcc", "bc", "x", true) 返回值為: "aabxcddbxc"
  6 KYString StringReplace(const char* AStr, long ALength,
  7                        const char* AOld, long AOldLen,
  8                        const char* ANew, long ANewLen,
  9                              bool  AReplaceAll     = false,
 10                              bool  ACaseSensitive  = true);
 11 KYString StringReplace(const KYString& AStr, const char* AOld, long AOldLen,
 12                                              const char* ANew, long ANewLen,
 13                                                    bool  AReplaceAll     = false,
 14                                                    bool  ACaseSensitive  = true);
 15 inline KYString StringReplace(const KYString& AStr, const KYString& AOld,
 16                               const KYString& ANew, bool  AReplaceAll    = false,
 17                                                     bool  ACaseSensitive = true)
 18 {
 19    return StringReplace(AStr, (char*)AOld, AOld.Length(),
 20                               (char*)ANew, ANew.Length(),
 21                               AReplaceAll, ACaseSensitive);
 22 }
 23 
 24 // 給字符串加單引號, 若字符中存在單引號則自動(dòng)添加二個(gè)單引號
 25 // 如: QuotedStr("abc'123'def") 返回值為: "'abc''123''def'"
 26 KYString QuotedStr(const char* AStr, int ALength);
 27 inline KYString QuotedStr(const KYString& AStr)
 28 {
 29    return QuotedStr((char*)AStr, AStr.Length());
 30 }
 31 
 32 
 33 /* 源文件(.cpp) */
 34 
 35 // 在 AStr 中查找 AOld 串, 并使用 ANew 替換
 36 // 如: StringReplace("aabbccddbbcc", "bc", "x", true) 返回值為: "aabxcddbxc"
 37 // 注: 1. 若未找到 AOld 串則返回空串并 ANoFound == true, 否則 ANoFound == false;
 38 //     2. 參數(shù) AStr, ALength, AOld, ALen 必須合法
 39 //     3. SameStr(AOld, ANew, true) 必須為 false, 內(nèi)部不檢查是否相同
 40 static KYString _DoStringReplace(const char* AStr,        long ALength,
 41                                  const char* AOld,        long AOldLen,
 42                                  const char* ANew,        long ANewLen,
 43                                        bool  AReplaceAll, bool ACaseSensitive,
 44                                        bool& ANoFound)
 45 {
 46    // 初始化
 47    KYString result, strNext;
 48    int*     pNext;
 49    long     intPos;
 50 
 51    // 校正長度
 52    if ((ANew == NULL) || (ANewLen < 0))
 53       ANewLen = 0;
 54 
 55    // 分配緩沖區(qū)
 56    strNext.SetLength(sizeof(int* AOldLen);
 57    pNext = (int*)(char*)strNext;
 58 
 59    // 得到目標(biāo)串的 KMP 的回溯表
 60    GetKMPNext(AOld, AOldLen, pNext, ACaseSensitive);
 61 
 62    // 查找第一個(gè)匹配
 63    ANoFound = false;
 64    intPos   = _FindNext(AStr, ALength, AOld, AOldLen,
 65                         pNext, 11, ACaseSensitive) - 1;
 66    if (intPos < 0)
 67       ANoFound = true;
 68    else if (!AReplaceAll)
 69    {
 70       // 分配空間
 71       result.SetLength(ALength + (ANewLen - AOldLen));
 72       char* pPos = (char*)result;
 73 
 74       // 拷貝數(shù)據(jù)
 75       if (pPos != NULL)
 76       {
 77          // 拷貝前半部
 78          if (intPos > 0)
 79          {
 80             memcpy(pPos, AStr, intPos);
 81             pPos += intPos;
 82          }
 83 
 84          // 拷貝新串
 85          if (ANewLen > 0)
 86          {
 87             memcpy(pPos, ANew, ANewLen);
 88             pPos += ANewLen;
 89          }
 90 
 91          // 拷貝后半部
 92          intPos  += AOldLen;
 93          ALength -= intPos;
 94          if (ALength > 0)
 95          {
 96             AStr += intPos;
 97             memcpy(pPos, AStr, ALength);
 98          }
 99       }
100    }
101    else
102    {
103       // 初始化
104       KYString strNew;
105       char*    pBegin;
106       char*    pPos;
107       long     intLen;
108 
109       // 計(jì)算最大尺寸
110       if (ANewLen <= AOldLen)
111          intLen = ALength + (ANewLen - AOldLen);
112       else if (AOldLen == 1)
113          intLen = intPos + ANewLen * (ALength - intPos);
114       else
115          intLen = ALength + (ANewLen - AOldLen) * ((ALength - intPos) / AOldLen);
116 
117       // 分配緩沖區(qū)
118       strNew.SetLength(intLen);
119       pBegin = (char*)strNew;
120       pPos   = pBegin;
121 
122       // 拷貝數(shù)據(jù)
123       if (pPos != NULL)
124       {
125          // 循環(huán)查找
126          do
127          {
128             // 拷貝前半部
129             if (intPos > 0)
130             {
131                memcpy(pPos, AStr, intPos);
132                pPos += intPos;
133             }
134 
135             // 拷貝新串
136             if (ANewLen > 0)
137             {
138                memcpy(pPos, ANew, ANewLen);
139                pPos += ANewLen;
140             }
141 
142             // 查找下一匹配項(xiàng)
143             intPos  += AOldLen;
144             AStr    += intPos;
145             ALength -= intPos;
146             intPos   = _FindNext(AStr, ALength, AOld, AOldLen,
147                                  pNext, 11, ACaseSensitive) - 1;
148          } while (intPos >= 0);
149 
150          // 拷貝后半部
151          if (ALength > 0)
152          {
153             memcpy(pPos, AStr, ALength);
154             pPos += ALength;
155          }
156 
157          // 設(shè)置結(jié)果
158          result.SetString(pBegin, pPos - pBegin);
159       }
160    }
161 
162    // 返回結(jié)果
163    return result;
164 }
165 
166 // 在 AStr 中查找 AOld 串, 并使用 ANew 替換
167 // 注: SameStr(AOld, ANew, true) 必須為 false, 內(nèi)部不檢查是否相同
168 // 如: StringReplace("aabbccddbbcc", "bc", "x", true) 返回值為: "aabxcddbxc"
169 KYString StringReplace(const char* AStr,        long ALength,
170                        const char* AOld,        long AOldLen,
171                        const char* ANew,        long ANewLen,
172                              bool  AReplaceAll, bool ACaseSensitive)
173 {
174    // 初始化
175    KYString result;
176    bool     boolNoFound = true;
177 
178    // 檢查參數(shù)
179    if ((AStr != NULL) && (AOld != NULL) && (AOldLen > 0&& (ALength >= AOldLen))
180       result = _DoStringReplace(AStr, ALength, AOld, AOldLen, ANew, ANewLen,
181                                 AReplaceAll, ACaseSensitive, boolNoFound);
182 
183    // 若未找到則拷貝數(shù)據(jù)
184    if (boolNoFound)
185       result.SetString(AStr, ALength);
186 
187    // 返回結(jié)果
188    return result;
189 }
190 
191 // 在 AStr 中查找 AOld 串, 并使用 ANew 替換
192 // 注: SameStr(AOld, ANew, true) 必須為 false, 內(nèi)部不檢查是否相同
193 // 如: StringReplace("aabbccddbbcc", "bc", "x", true) 返回值為: "aabxcddbxc"
194 KYString StringReplace(const KYString& AStr, const char* AOld, long AOldLen,
195                                              const char* ANew, long ANewLen,
196                                                    bool  AReplaceAll,
197                                                    bool  ACaseSensitive)
198 {
199    // 初始化
200    KYString result;
201    bool     boolNoFound = true;
202 
203    // 檢查參數(shù)
204    if ((AOld != NULL) && (AOldLen > 0&& (AStr.Length() >= AOldLen))
205       result = _DoStringReplace((char*)AStr, AStr.Length(),
206                                 AOld, AOldLen, ANew, ANewLen,
207                                 AReplaceAll, ACaseSensitive, boolNoFound);
208 
209    // 若未找到則拷貝數(shù)據(jù)
210    if (boolNoFound)
211       result = AStr;
212 
213    // 返回結(jié)果
214    return result;
215 }
216 
217 // 給字符串加單引號, 若字符中存在單引號則自動(dòng)添加二個(gè)單引號
218 // 如: QuotedStr("abc'123'def") 返回值為: "'abc''123''def'"
219 KYString QuotedStr(const char* AStr, int ALength)
220 {
221    // 字符
222    #define  Char_Quoted    '\''     // 單引號
223 
224    // 靜態(tài)常量
225    static const KYString   Str_Null = "''";
226 
227    // 初始化
228    KYString result;
229 
230    // 判斷是否為空串
231    if ((AStr == NULL) || (ALength <= 0))
232       result = Str_Null;
233    else
234    {
235       // 分配足夠的字符串空間
236       KYString strNew;
237       strNew.SetLength(ALength + ALength + 2);
238 
239       // 初始化
240       char* pBegin   = (char*)strNew;
241       char* pPos     = pBegin;
242       char* pStr     = (char*)AStr;
243       char* pEnd     = pStr + ALength;
244 
245       // 左引號
246       *(pPos++= Char_Quoted;
247 
248       // 循環(huán)操作
249       while (pStr < pEnd)
250       {
251          // 判斷是否單引號
252          if (*pStr == Char_Quoted)
253             *(pPos++= Char_Quoted;
254 
255          // 字符賦值, 下一字符
256          *(pPos++= *(pStr++);
257       }
258 
259       // 右引號
260       *(pPos++= Char_Quoted;
261 
262       // 設(shè)置返回值
263       result.SetString(pBegin, pPos - pBegin);
264    }
265 
266    // 返回結(jié)果
267    return result;
268 }
269 

posted on 2011-05-22 12:05 Kyee Ye 閱讀(675) 評論(0)  編輯 收藏 引用 所屬分類: C++類庫KYLib 、源碼
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            99精品福利视频| 亚洲欧美日本国产有色| 黄色成人91| 亚洲自拍偷拍一区| 亚洲国语精品自产拍在线观看| 午夜在线不卡| 国产精品一区免费在线观看| 亚洲视频一区在线| 亚洲高清中文字幕| 免费不卡在线观看| 在线精品国产成人综合| 久久精品一二三| 亚洲欧美日韩视频一区| 国产人成一区二区三区影院| 午夜欧美不卡精品aaaaa| 亚洲无线视频| 国产精品爽黄69| 欧美一区二区三区视频免费| 亚洲精品护士| 在线观看亚洲| 麻豆国产va免费精品高清在线| 欧美中文字幕视频在线观看| 国产综合色精品一区二区三区| 久久国产精品久久精品国产| 欧美一区免费| 在线不卡欧美| 亚洲第一视频| 欧美日本网站| 亚洲欧美综合精品久久成人| 亚洲欧美精品在线观看| 国产一区二区三区精品久久久| 久久久久久9| 久久精品综合网| 91久久精品一区二区别| 亚洲日本成人| 国产精品亚洲激情| 久久久久综合一区二区三区| 久久久久国色av免费看影院| 亚洲人成久久| 一区二区三区视频观看| 国产精品尤物福利片在线观看| 久久国产精品亚洲va麻豆| 久久福利电影| 亚洲精品日韩久久| 亚洲天堂av综合网| 国产日韩精品一区二区三区| 蜜桃久久av一区| 欧美精品1区2区| 亚洲欧美日韩一区二区三区在线| 欧美一级淫片aaaaaaa视频| 尤物视频一区二区| 亚洲精品少妇网址| 国产日韩视频| 亚洲国产天堂久久综合网| 欧美午夜精品久久久久免费视 | 欧美午夜不卡| 久久国产精品高清| 欧美日韩视频不卡| 久久蜜桃香蕉精品一区二区三区| 欧美日韩久久精品| 久久视频一区二区| 欧美午夜视频在线| 91久久精品一区二区三区| 国产麻豆91精品| 亚洲人成网站999久久久综合| 国产情人节一区| 日韩一二三在线视频播| 亚洲二区在线观看| 欧美一级午夜免费电影| 亚洲一区亚洲| 欧美风情在线观看| 美女精品在线| 国产精品欧美久久久久无广告| 欧美顶级少妇做爰| 国产日韩欧美a| 中国av一区| 亚洲美女免费精品视频在线观看| 欧美一区二区三区视频免费| 亚洲一二三区视频在线观看| 欧美一级欧美一级在线播放| 久久综合久久综合久久综合| 欧美日韩国产综合视频在线| 免费成人毛片| 国产一区日韩二区欧美三区| 中国成人亚色综合网站| 亚洲精品乱码久久久久久蜜桃91| 午夜精品免费在线| 亚洲欧美日韩国产一区二区三区 | 欧美精品在线免费| 欧美成人免费在线观看| 国产欧美日韩一区| 在线午夜精品| 在线亚洲观看| 欧美人成在线视频| 亚洲精品社区| 一区二区三区久久网| 欧美激情在线有限公司| 欧美国产一区二区三区激情无套| 一区精品在线| 久久综合九色| 欧美成人网在线| 91久久精品日日躁夜夜躁国产| 农夫在线精品视频免费观看| 亚洲国产精品99久久久久久久久| 亚洲二区视频在线| 欧美二区视频| 亚洲三级免费观看| 亚洲一区二区三区影院| 国产精品久久777777毛茸茸| 中文欧美在线视频| 欧美在线视频全部完| 国产日韩欧美一区二区三区在线观看 | 伊人男人综合视频网| 久久国产手机看片| 欧美www在线| 日韩天堂av| 国产精品国产三级欧美二区| 午夜久久美女| 欧美不卡一区| 中文欧美字幕免费| 国产美女一区二区| 男男成人高潮片免费网站| 亚洲伦理在线| 欧美自拍偷拍午夜视频| 亚洲国产精品电影在线观看| 欧美精品久久久久久久久老牛影院| 一区二区三区四区五区在线| 久久久精品国产免大香伊 | av成人免费在线| 国产精品久久9| 久久香蕉国产线看观看av| 亚洲国产色一区| 香蕉久久a毛片| 亚洲高清在线精品| 国产精品久久久久影院色老大 | 一本久道久久综合中文字幕| 亚洲制服丝袜在线| 久久激情五月激情| 亚洲国产91| 性欧美1819性猛交| 亚洲激情在线观看| 国产乱码精品一区二区三| 欧美在现视频| 亚洲最新在线视频| 欧美国产日韩精品| 午夜精品福利电影| 最新成人在线| 狠狠干综合网| 国产精品卡一卡二卡三| 牛人盗摄一区二区三区视频| 欧美一级理论片| 夜夜嗨av一区二区三区四季av| 免费亚洲电影在线| 欧美一区中文字幕| 亚洲系列中文字幕| 亚洲精品国产精品国自产观看浪潮| 国产婷婷色一区二区三区在线 | 欧美激情第六页| 久久国产欧美日韩精品| 国产精品99久久99久久久二8 | 一区二区日韩免费看| 韩国自拍一区| 国产日韩精品视频一区二区三区| 欧美日韩一区三区| 欧美国产日韩精品| 久久国产高清| 午夜视频久久久| 亚洲午夜国产一区99re久久 | 免费欧美电影| 久久精品中文字幕一区| 亚洲欧美日韩国产中文在线| 一区二区不卡在线视频 午夜欧美不卡在| 欧美国内亚洲| 欧美承认网站| 欧美福利视频在线| 欧美高清视频一二三区| 免费看精品久久片| 久热这里只精品99re8久| 久久米奇亚洲| 欧美阿v一级看视频| 欧美成人亚洲成人| 欧美 亚欧 日韩视频在线| 麻豆精品视频在线观看| 久久一区二区三区四区| 噜噜爱69成人精品| 另类图片国产| 亚洲高清一区二| 亚洲日本在线观看| 99在线|亚洲一区二区| 一区二区三区视频在线播放| 一区二区三区色| 午夜精品国产更新| 久久久人成影片一区二区三区| 久久久噜噜噜久久久| 蜜臀a∨国产成人精品| 欧美日韩成人网| 欧美视频一区在线| 国产视频欧美| 亚洲国产美国国产综合一区二区| 亚洲另类自拍|