c语⾔中的⽂本字符串替换,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
basic_string& assign (InputIterator first, InputIterator last);
ps:charT是类模板basic_string的第1个参数,指定了字符串中字符的类型。⽤char实例化basic_string,得到string(可参考在下
的“C++ string到底是什么”)。所以, 在string中,charT就是char。
⽰例:
#include
#include
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(), d() - 1);
cout << str << endl;//12345 从开头到结尾-1(即倒数第个字符)
//str.assign(str1.begin() + 4, d() - 4);//不能反着来,即试图将以str1.begin() + 4(5)开头,以d() - 4(2)结尾的5432给str是不⾏的
//cout << str << endl;                        //这样会出现运⾏时错误
str.assign(str1.begin() + 2, d() - 3);//前后指向同⼀字符(3),这样可以
cout << str << endl;//3
str.assign(str1.begin() + 2, d() - 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
#include
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 il);
//move (8)
basic_string& assign (basic_string&& str) noexcept;
其中,(7)与list容器有关,⽽(8)与右值引⽤和移动语义有关,这⾥我们暂不详述。
对于(8)中的noexcept关键字,它声明了函数不会抛出异常(当然函数不是真的就永远都不会抛出异常,⽐如该函数A(声明为noexcept)中调⽤了另⼀个函数B,⽽函数B中有抛出异常语句,那么,当我们调⽤函数A是,就可能抛出异常),由于noexcept不是本⽂的重点,这⾥我们不详述,有兴趣的读者可以⾃⾏查阅资料了解学习相关内容。
2.swap()
原型:void swap (basic_string& str);
c++string类型只有这⼀个,要交换就交换整个字符串,这⾥没有针对⼦串的操作。
不举例。
原型:
//sequence (1)
basic_string& erase (size_type pos = 0, size_type len = npos);
//character (2)
iterator erase (iterator p);
//range (3)
iterator erase (iterator first, iterator last);
说明:
注意到basic_string& erase (size_type pos = 0, size_type len = npos);给出了默认参数,这样,我们在使⽤该函数时,就可以省略第2个参数,效果是删除从第1个参数所指位置(包括该位置)起的所有字符(正如下边⽰例中有关str3的操作和输出)。原因是len=npos,⽽npos ⼀定⼤于string对象的最⼤长度。
⽰例:
#include
#include
using namespace std;
int main()
{
string str1("123456789");
string str2("123456789");
string str3("123456789");
string str4("123456789");
string str5("123456789");
string str6("123456789");
string str7("123456789");
string str8("123456789");
cout << str1 << endl;//126789
//因为'\0'已经是最后⼀个)
cout << str3 << endl;//1234567  当省略第2个参数时,删除第1个参数所指位置起(即包括该位置)的所有字符
//ase(10, 5);//这么做不⾏
//cout << str4 << endl;
cout << str4 << endl;//23456789
cout << str5<< endl;//12456789
//ase(str6.begin() + 10);//这么做不⾏
//cout << str6 << endl;
cout << str6 << endl;//12345679
//d() - 10);//这么做不⾏
//cout << str7 << endl;
cout << str7 << endl;//1289  删除从str7.begin()+2(包括str7.begin()+2)到d() - 2(包括d() - 2)的所有字符//ase(str8.begin() + 7, d() - 5);//这么做不⾏
//cout << str8 << endl;
return 0;
}
4.clear()
原型:
void clear() noexcept;
作⽤:
删除字符串的所有内容。
⽰例:
#include
#include
using namespace std;
int main()
{
string str("123456789");
str.clear();
cout << str << endl;//空⾏
cout << str.length() << endl;//0
return 0;
}
5.insert()
原型:
//string (1)
basic_string& insert (size_type pos, const basic_string& str);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。