在CodeProject上有朋友说我不应该将空白字符限制在" /t/n/r" 以内,应该使用isspace来实现trim函数,以处理Unicode的空白字符。此话在理,所以将trim的三个函数改了一下。(参阅上一篇《std::string的工具函数》)

  1. string trimLeft(const string& str) {  
  2.     string t = str;  
  3.     for (string::iterator i = t.begin(); i != t.end(); i++) {  
  4.         if (!isspace(*i)) {  
  5.             t.erase(t.begin(), i);  
  6.             break;  
  7.         }  
  8.     }  
  9.     return t;  
  10. }  
  11.  
  12. string trimRight(const string& str) {  
  13.     if (str.begin() == str.end()) {  
  14.         return str;  
  15.     }  
  16.  
  17.     string t = str;  
  18.     for (string::iterator i = t.end() - 1; i != t.begin(); i--) {  
  19.         if (!isspace(*i)) {  
  20.             t.erase(i + 1, t.end());  
  21.             break;  
  22.         }  
  23.     }  
  24.     return t;  
  25. }  
  26.  
  27. string trim(const string& str) {  
  28.     string t = str;  
  29.  
  30.     string::iterator i;  
  31.     for (i = t.begin(); i != t.end(); i++) {  
  32.         if (!isspace(*i)) {  
  33.             t.erase(t.begin(), i);  
  34.             break;  
  35.         }  
  36.     }  
  37.  
  38.     if (i == t.end()) {  
  39.         return t;  
  40.     }  
  41.  
  42.     for (i = t.end() - 1; i != t.begin(); i--) {  
  43.         if (!isspace(*i)) {  
  44.             t.erase(i + 1, t.end());  
  45.             break;  
  46.         }  
  47.     }  
  48.  
  49.     return t;  

原理很浅显,就是把原来用find_first_of和find_first_not_of实现的查找换成循环,自己用isspace来判断。本来想参考一下boost的实现,不过发现它的代码实在有点复杂,所以还是自己用简单的循环来解决了。