afString.cpp
上传用户:kaiguan
上传日期:2007-10-28
资源大小:1074k
文件大小:8k
源码类别:

其他游戏

开发平台:

Visual C++

  1. // afString.cpp: implementation of the afString class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "afString.h"
  6. #pragma warning(disable: 4514)
  7. #include <stdlib.h>
  8. #include <stdarg.h>
  9. #include <stdio.h>
  10. #include <ctype.h>
  11. const int maxStringlength = 2000;
  12. afString::afString(const afString& other)
  13. {
  14. string = NULL;
  15. *this = other;
  16. }
  17. afString::afString(const char *nString)
  18. {
  19. if(nString)
  20. {
  21. string = new char[strlen(nString)+1];
  22. strcpy(string, nString);
  23. }
  24. else
  25. string = NULL;
  26. }
  27. afString::~afString()
  28. {
  29. if (string!=NULL)
  30. delete string;
  31. }
  32. afString& afString::set(const char *nString,...)
  33. {
  34. char tempString[maxStringlength];
  35.     va_list marker;
  36. if (string!=NULL)
  37. delete string;
  38. if (nString!=NULL)
  39. {
  40. va_start(marker, nString);
  41. vsprintf(tempString,nString,marker);
  42. assert(strlen(tempString)<maxStringlength);
  43. string = new char[strlen(tempString)+1];
  44. strcpy(string,tempString);
  45. }
  46. else
  47. string = NULL;
  48.     return *this;
  49. }
  50. afString& afString::cat(const char *nString)
  51. {
  52. assert(nString!=NULL);
  53. if (string==NULL)
  54. {
  55. //Set(nString);
  56. string = new char[strlen(nString)+1];
  57. strcpy(string,nString);
  58. }
  59. else
  60. {
  61. char *temp = string;
  62. string = new char[strlen(temp)+strlen(nString)+1];
  63. strcpy(string,temp);
  64. strcat(string,nString);
  65. delete temp;
  66. }
  67.     return *this;
  68. }
  69. int afString::length() const
  70. {
  71. if (string!=NULL)
  72. return strlen(string);
  73. else 
  74. return 0;
  75. }
  76. bool afString::consistsJustOf(const afString& cSet) const 
  77. {
  78.     int i1, i2;
  79.     bool found;
  80. if (string!=NULL)
  81. {
  82. for (i1=0; i1<length(); ++i1)
  83.         {
  84. for (i2=0,found=false ;i2<cSet.length(); ++i2)
  85. if(string[i1]==cSet[i2])
  86.                     found = true;
  87.             if(!found)
  88.     return false;
  89.         }
  90. }
  91. return true;
  92. }
  93. int afString::getIndex(const char c,bool forward) const 
  94. {
  95. if (forward)
  96. return getIndex(0,c,forward);
  97. else
  98. return getIndex(length(),c,forward);
  99. }
  100. int afString::getIndex(int start,const char c,bool forward) const
  101. {
  102. if(start==-1)
  103. start = forward ? 0 : (length()-1);
  104. assert(start>=0 && start<=length());
  105. if (string!=NULL)
  106. {
  107. if (forward)
  108. {
  109. for (int i=start;i<length();++i)
  110. if (string[i]==c)
  111. return i;
  112. }
  113. else
  114. {
  115. for (int i=start;i>=0;--i)
  116. if (string[i]==c)
  117. return i;
  118. }
  119. }
  120. return -1;
  121. }
  122. int afString::getIndexNot(const char c,bool forward) const 
  123. {
  124. if (forward)
  125. return getIndexNot(0,c,forward);
  126. else
  127. return getIndexNot(length(),c,forward);
  128. }
  129. int afString::getIndexNot(int start,const char c,bool forward) const
  130. {
  131. if(start==-1)
  132. start = forward ? 0 : (length()-1);
  133. assert(start>=0 && start<length());
  134. if (string!=NULL)
  135. {
  136. if (forward)
  137. {
  138. for (int i=start;i<length();++i)
  139. if (string[i]!=c)
  140. return i;
  141. }
  142. else
  143. {
  144. for (int i=start;i>=0;--i)
  145. if (string[i]!=c)
  146. return i;
  147. }
  148. }
  149. return -1;
  150. }
  151. int afString::getIndex(const afString& other,bool forward) const 
  152. {
  153. if (forward)
  154. return getIndex(0,other,forward);
  155. else
  156. return getIndex(length()-1,other,forward);
  157. }
  158. int afString::getIndex(int start,const afString& other,bool forward) const
  159. {
  160. if(start==-1)
  161. start = forward ? 0 : (length()-1);
  162. if (string!=NULL && start>=0 && start<length())
  163. {
  164. int l1 = length();
  165. int l2 = other.length();
  166. if (forward)
  167. {
  168. for (int i=start;i<l1;++i)
  169. {
  170.         int i1,i2;
  171. for (i1=i,i2=0;i1<l1 && i2<l2 &&
  172. string[i1]==other[i2];++i1,++i2);
  173. if (i2==l2)
  174. return i;
  175. }
  176. }
  177. else
  178. {
  179. for (int i=start;i>=0;--i)
  180. {
  181.         int i1,i2;
  182. for (i1=i,i2=0;i1<l1 && i2<l2 &&
  183. string[i1]==other[i2];++i1,++i2);
  184. if (i2==l2)
  185. return i;
  186. }
  187. }
  188. }
  189. return -1;
  190. }
  191. int afString::getCNum(const char c) const
  192. {
  193. int ret = 0;
  194. if (string!=NULL)
  195. {
  196. for (int i=0;i<length();++i)
  197. if (string[i]==c)
  198. ++ret;
  199. }
  200. return ret;
  201. }
  202. afString afString::getSubString(int from,int count) const
  203. {
  204. char *str;
  205. assert(from>=0);
  206. if (count==-1)
  207. count = length()-from;
  208. assert((from+count)<=length());
  209. assert(count>=0);
  210. str = new char[count+1];
  211. int i1,i2;
  212. for (i1=from,i2=0;i2<count;++i1,++i2)
  213. str[i2] = string[i1];
  214. str[i2]=0;
  215. afString ret;
  216. ret.setBuffer(str);
  217. return ret;
  218. }
  219. afString& afString::toLower()
  220. {
  221.    char *ptr = string;
  222.    while(*ptr)
  223.    {
  224.      if (isupper(*ptr))
  225.        *ptr = static_cast<char>(tolower(*ptr));
  226.      ++ptr;
  227.    }
  228.    return *this;
  229. }
  230. afString& afString::toUpper()
  231. {
  232.    char *ptr = string;
  233.    while(*ptr)
  234.    {
  235.      if (islower(*ptr))
  236.        *ptr = static_cast<char>(toupper(*ptr));
  237.      ++ptr;
  238.    }
  239.    return *this;
  240. }
  241. char afString::toLower(char nC)
  242. {
  243. const char a='a',A='A'; 
  244. if (isalpha(nC))
  245. {
  246. if (isupper(nC))
  247. nC = static_cast<char>(a+(nC-A));
  248. }
  249. return nC;
  250. }
  251. char afString::toUpper(char nC)
  252. {
  253. const char a='a',A='A'; 
  254. if (isalpha(nC))
  255. {
  256. if (islower(nC))
  257. nC = static_cast<char>(A+(nC-a));
  258. }
  259. return nC;
  260. }
  261. afString& afString::cutC(const char c,bool forward)
  262. {
  263. int i,index=-1;
  264. if (string!=NULL)
  265. {
  266. if (forward)
  267. {
  268. for (i=0;(i<length());++i)
  269. if (string[i]==c)
  270. index = i;
  271. else
  272. break;
  273. if (index!=-1)
  274. *this = getSubString(index+1,-1);
  275. }
  276. else
  277. {
  278. int l=length()-1;
  279. for (i=l;i>=0;--i)
  280. if (string[i]==c)
  281. index = i;
  282. else
  283. break;
  284. if (index!=-1)
  285. *this = getSubString(0,index);
  286. }
  287. }
  288.     return *this;
  289. }
  290. afString& afString::cut(char c)
  291. {
  292. cutC(c,true);
  293. cutC(c,false);
  294.     return *this;
  295. }
  296. afString& afString::cutS(const afString& cs,bool forward)
  297. {
  298. int i,index=-1;
  299. if (string!=NULL)
  300. {
  301. if (forward)
  302. {
  303. for (i=0;(i<length());++i)
  304. if (cs.getIndex(string[i])>-1)
  305. index = i;
  306. else
  307. break;
  308. if (index!=-1)
  309. *this = getSubString(index+1,-1);
  310. }
  311. else
  312. {
  313. int l=length()-1;
  314. for (i=l;i>=0;--i)
  315. if (cs.getIndex(string[i])>-1)
  316. index = i;
  317. else
  318. break;
  319. if (index!=-1)
  320. *this = getSubString(0,index-1);
  321. }
  322. }
  323.     return *this;
  324. }
  325. afString& afString::cut(const afString& cs)
  326. {
  327. cutS(cs,true);
  328. cutS(cs,false);
  329.     return *this;
  330. }
  331. int afString::find(const afString& nSubString)
  332. {
  333. if (string!=NULL)
  334. {
  335. char *sub = strstr(string,nSubString);
  336. if (sub!=NULL)
  337. return (sub - string +1);
  338. }
  339. return -1;
  340. }
  341. bool afString::operator<( const afString& other) const
  342. {
  343. if ((string == NULL) || (other.string == NULL))
  344. return (string < other.string);
  345. return (strcmp(string,other.string)<0);
  346. }
  347. bool afString::operator>( const afString& other) const
  348. {
  349. if ((string == NULL) || (other.string == NULL))
  350. return (string > other.string);
  351. return (strcmp(string,other.string)>0);
  352. }
  353. bool afString::operator==( const afString& other) const
  354. {
  355. if ((string == NULL) || (other.string == NULL))
  356. return (string == other.string);
  357. return (!strcmp(string,other.string));
  358. }
  359. bool afString::operator==( const char* str) const
  360. {
  361. if ((string == NULL) || (str == NULL))
  362. return (string == str);
  363. return (!strcmp(string,str));
  364. }
  365. bool afString::operator!=( const afString& other) const
  366. {
  367. if ((string == NULL) || (other.string == NULL))
  368. return (string != other.string);
  369. return (strcmp(string,other.string)!=0);
  370. }
  371. bool afString::operator!=( const char* str) const
  372. {
  373. if ((string == NULL) || (str == NULL))
  374. return (string != str);
  375. return (strcmp(string,str)!=0);
  376. }
  377. afString& afString::operator=( const afString& other)
  378. {
  379. if(string)
  380. delete string;
  381. if (other.string==NULL)
  382. {
  383. string = NULL;
  384. }
  385. else
  386. {
  387. string = new char[strlen(other.string)+1];
  388. strcpy(string, other.string);
  389. }
  390. return *this;
  391. }
  392. afString& afString::operator+=( const afString& other)
  393. {
  394. cat(other);
  395. return *this;
  396. }
  397. bool operator==(const char* left, const afString& right)
  398. {
  399.     return right==left;
  400. }
  401. void afString::setBuffer(char* nBuffer)
  402. {
  403. if(string)
  404. delete string;
  405. string = nBuffer;
  406. }