在CodeProject上有朋友说我不应该将空白字符限制在" /t/n/r" 以内,应该使用isspace来实现trim函数,以处理Unicode的空白字符。此话在理,所以将trim的三个函数改了一下。(参阅上一篇《std::string的工具函数》)
- string trimLeft(const string& str) {
- string t = str;
- for (string::iterator i = t.begin(); i != t.end(); i++) {
- if (!isspace(*i)) {
- t.erase(t.begin(), i);
- break;
- }
- }
- return t;
- }
- string trimRight(const string& str) {
- if (str.begin() == str.end()) {
- return str;
- }
- string t = str;
- for (string::iterator i = t.end() - 1; i != t.begin(); i--) {
- if (!isspace(*i)) {
- t.erase(i + 1, t.end());
- break;
- }
- }
- return t;
- }
- string trim(const string& str) {
- string t = str;
- string::iterator i;
- for (i = t.begin(); i != t.end(); i++) {
- if (!isspace(*i)) {
- t.erase(t.begin(), i);
- break;
- }
- }
- if (i == t.end()) {
- return t;
- }
- for (i = t.end() - 1; i != t.begin(); i--) {
- if (!isspace(*i)) {
- t.erase(i + 1, t.end());
- break;
- }
- }
- return t;
- }
原理很浅显,就是把原来用find_first_of和find_first_not_of实现的查找换成循环,自己用isspace来判断。本来想参考一下boost的实现,不过发现它的代码实在有点复杂,所以还是自己用简单的循环来解决了。
本文转自边城__ 51CTO博客,原文链接:http://blog.51cto.com/jamesfancy/843204,如需转载请自行联系原作者