设为首页 加入收藏

TOP

C++string中有关字符串内容修改和替换的函数浅析(一)
2015-07-16 12:57:02 来源: 作者: 【 】 浏览:30
Tags: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(), 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
#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);
只有这一个,要交换就交换整个字符串,这里没有针对子串的操作。
不举例。


3.erase()


原型:


//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");
? ? str1.erase(2, 3);
? ? cout << str1 << endl;//126789
? ? str2.erase(2, 10); cout << endl;//空行
? ? str3.erase(7);//注意这里的参数值不能超过str3.length(),否则会出现运行时错误等于是输出空行,相当于删除'\0'及其后面的(当然后面什么也没有,
? ? ? ? ? ? ? ? ? //因为'\0'已经是最后一个)
? ? cout << str3 << endl;//1234567? 当省略第2个参数时,删除第1个参数所指位置起(即包括该位置)的所有字符
? ? //str4.er

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++ string到底是什么? 下一篇C++string中有关大小和容量的函数..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: