关于C++中string使用assign函数的问题

#include <iostream>
#include <string>

using namespace std;
int main()
{
    string s1 = "aaaaaaAAA001002003 ";
    string s2;
    int flag;

    flag = s1.find("AAA");
    if(flag < s1.length())
    {
        s2.assign(s1,flag + 3,s1.length()-1); //此处的assign函数,第三个参数。
        s1.erase(flag,s1.length());
        cout<<s1.length()<<endl;
    }

    cout<<s1<<" ";
    cout<<s2;

    system("pause");
    return 0;
}

以上是测试的代码,在标有注释的第三个参数,也就是s1.length()-1这里(因为最后一个字符为空格,所以-1)
但是无论是改为-1,-2,-3,最后输出的结果都是"001002003 ",编译器每次都ReBuild了。
所以我的问题是:第三个参数是不是不能参与运算?必须包含最后一个空格进去嘛?

阅读 5.1k
2 个回答

这类问题首先应该去查查文档,看看 assign 接口到底怎么定义,怎么使用的,然后会看到

string& assign (const string& str, size_t subpos, size_t sublen);

就从参数名基本上可以了解第二个参数是起始位置,第三个参数是子串长度,这一点从后面的解释也可以看到

sublen
Length of the substring to be copied (if the string is shorter, as many characters as possible are copied).
A value of string::npos indicates all characters until the end of str.

这就说得很明白了,如果字符串不够长(比如指定的 sublen 比较大),就有多少算多少。很显然,这个用例中,如果要截断后面的字符串,至少要 -10 才行。

你那个s1.length()-1明显大于001002003 这个长度, 应该再减去flag+3. 即, s1.length()-1-flag-3.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题