在代码中需要实现这样一个功能,需要将[00000001]这个存储在string中的字符串的中括号去掉,首先想到的就是string.erase()这个函数。结果。。。
代码:
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 void strSize() 7 { 8 string strTest = "[0000-0001]"; 9 strTest.erase(strTest.size() - 1); 10 strTest.erase(0); 11 } 12 13 void strLength() 14 { 15 string strTest = "[0000-0001]"; 16 strTest.erase(strTest.length() - 1); 17 strTest.erase(0); 18 19 cout << strTest << endl; 20 } 21 22 void strIterator() 23 { 24 string strTest = "[0000-0001]"; 25 strTest.erase(strTest.begin()); 26 strTest.erase(strTest.end() - 1); 27 } 28 29 int main(int argc, char *argv) 30 { 31 strIterator(); 32 33 return 0; 34 }
这段代码中一共有三个函数进行测试,却只有一个可用,strIterator
其他两个总是会提示段错误。而且,跟踪调试发现,使用过erase后,strTest的size就变为0了。
待以后自己知识足够了再来解决。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
问题解决了:
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 // 去处头部或者尾部的空白 6 void trimStr(string &str) 7 { 8 int nHeadPos = 0; 9 int nTailPos = 0; 10 11 nHeadPos = str.find_first_not_of(' ', 0); 12 str.erase(0, nHeadPos); 13 nTailPos = str.find_last_not_of(' '); 14 str.erase(nTailPos + 1); 15 } 16 17 int main(int argc, char **argv) 18 { 19 string strTest = " hello "; 20 trimStr(strTest); 21 22 return 0; 23 }
原因是因为我把string::erase()的用法用错了。下面是它的三个重载版本
1 string& erase (size_t pos = 0, size_t len = npos); 2 3 iterator erase (iterator p); 4 5 iterator erase (iterator first, iterator last);
参考:http://www.cplusplus.com/reference/string/string/erase/
根据它的定义可以知道,第一个是删除从指定下标开始len个字符的字符串。不指定则删除到结尾。(这就是我用错的原因,我以为可以删除指定下标出的字符,当然,如果长度指定为1也是可以的。)
而通过迭代器可以,是因为第二个重载版本的存在,它的作用是删除迭代器指向的字符。
第三个是删除两个迭代器之间的字符
虽然这个错误很低级,但是通过这次的错误,也让我更加了解了这个函数的使用。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
加油吧,少年!