C++string中有关字符串内容修改和替换的函数浅析

C++string中有关字符串内容修改和替换的函数浅析

1.assign()

原型: 

//string (1)
basic_string& assign (const basic_string& str);
//substring (2)
basic_string& assign (const basic_string& str, size_type subpos, size_type sublen);
//c-string (3)
basic_string& assign (const charT* s);
//buffer (4)
basic_string& assign (const charT* s, size_type n);
//ill (5)
basic_string& assign (size_type n, charT c);
//range (6)
template <class InputIterator>
  basic_string& assign (InputIterator first, InputIterator last);

ps:charT是类模板basic_string的第1个参数,指定了字符串中字符的类型。用char实例化basic_string,得到string(可参考在下的“C++ string到底是什么”)。所以, 在string中,charT就是char。

示例:

#include<iostream>
#include<string>

using namespace std;

int main()
{
    string str1("123456");
    string str = "123456789";
    char* str2 = "abcdef";
    str.assign(str1);
    cout << str << endl;//123456  可见执行assign()后,str将被重写
    str.assign(str1, 2, 3);
    cout << str << endl;//345  从位置2开始的3个字符
    str.assign(str1, 1, 20);//超出范围
    cout << str << endl;//23456
    cout << str.length() << endl;//5 可见没有空格
    str.assign(str1, 2, str1.npos);//后面介绍npos
    cout << str << endl;//3456  从位置2到末尾的字符给str
    str.assign(5, 'X');
    cout << str << endl;//XXXXX
    str.assign(str1.begin(), str1.end() - 1);
    cout << str << endl;//12345 从开头到结尾-1(即倒数第个字符)
    //str.assign(str1.begin() + 4, str1.end() - 4);//不能反着来,即试图将以str1.begin() + 4(5)开头,以str1.end() - 4(2)结尾的5432给str是不行的
    //cout << str << endl;                        //这样会出现运行时错误
    str.assign(str1.begin() + 2, str1.end() - 3);//前后指向同一字符(3),这样可以
    cout << str << endl;//3
    str.assign(str1.begin() + 2, str1.end() - 4);//这个却可以
    cout << str << endl;//空行
    cout << str.length() << endl;//0
    str.assign("abcdefg", 6);
    cout << str << endl;//abcdef 将abcdefg的前6个字符给str
    str.assign("abcdefg", 20);//超出范围
    cout << str << endl;//abcdefg+乱码
    cout << str.length() << endl;//10  说明将"abcdefg+3个空格"给了str
    str.assign(3, 0x41);
    cout << str << endl;//AAA  可以使用16进制的ASCII码 0x41换成10进制是65,是A的ASCII码
    str.assign(str2);
    cout << str << endl;//abcdef
    str.assign(str2, 2, 3);
    cout << str << endl;//cde  对char*型也可以
    return 0;
}

以上代码中有一句
str.assign(str1, 2, str1.npos);
这里我们解释npos:
它的定义如下:
std::string::npos
static const size_t npos = -1;
它是size_t类型的最大值,有些编译器也将它置为string对象的最大容量(按字节算,包括'\0'),而有些编译器不是,我们在后边将会看到。
为什么是最大呢?
-1用反码存储(32位),就是32个1,而size_t是无符号整型,所以,32个1的2进制转化为10进制就是2的32次方-1,即4294967295。
看下面一段验证代码:

#include<iostream>
#include<string>

using namespace std;

int main()
{
    string str1 = "123456789";
    cout << str1.npos << endl;//4294967295
    cout << (str1.npos == -1) << endl;//1
    cout << str1.max_size() << endl;//4294967294  1073741820(=2^30-4)
    return 0;
}

其中,4294967294是VS2013上的结果,可见max_size()不包括'\0',1073741820是CodeBlocks12.11上的结果。
由此,我们可知,str.assign(str1, 2, str1.npos);等价于str.assign(str1, 2, 4294967294);

另外,在C++11中,还有两个重载的assign()函数,它们的原型分别是:

//initializer list(7)
basic_string& assign (initializer_list<charT> il);
//move (8)
basic_string& assign (basic_string&& str) noexcept;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/128aa60f95789796d51326bdbb27a34b.html