zoukankan      html  css  js  c++  java
  • string.erase()--已解决

    在代码中需要实现这样一个功能,需要将[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也是可以的。)

    而通过迭代器可以,是因为第二个重载版本的存在,它的作用是删除迭代器指向的字符。

    第三个是删除两个迭代器之间的字符

    虽然这个错误很低级,但是通过这次的错误,也让我更加了解了这个函数的使用。

    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    加油吧,少年!

  • 相关阅读:
    写日志文件
    内存文件映射应用举例『转』
    HOOK编程
    获取当前进程的名称
    C++实现FTP文件传输
    C/C++ 实现windows进程/线程/模块 遍历
    Unicode下的CString与char *转换
    MFC常用基本数据类型
    geos 3.6.1编译 win7 vs2015
    JQuery Mobile iscroll插件使用教程及注意事项
  • 原文地址:https://www.cnblogs.com/lit10050528/p/4064677.html
Copyright © 2011-2022 走看看