字符串操作看似简单,其实非常重要,不注意的话,经常出现代码运行结果和自己想要的不一致,甚至崩溃。本文总结了一些构建string对象方法、修改string对象的方法、string类型的操作函数、string类型的查找、string对象的比较。 1 构建string对象方法 首先,为了在我们的程序中使用string类型,我们必须包含头文件 。如下:#include 声明一个字符串变量很简单:string str; 这样我们就声明了一个字符串变量,但既然是一个类,就有构造函数和析构函数。上面的声明没有传入参数,所以就直接使用了string的默认的构造函数,这个函数所作的就是把str初始化为一个空字符串。 string类的构造函数和析构函数如下: string类函数 说明
string s; 生成一个空字符串s
string s(s2); 拷贝构造函数 生成s2的复制品
string s(value); 用字符串value初始化s
string s(b,e); 以区间b,e内的字符作为字符串s的初值
string s(cp,n); 取字符数组,前n个字符作初值
string s(s2,pos2); 将字符串s2始于位置pos2部分当作字符串的初值
string s(s2,pos1,len); 将字符串s2内始于pos1且长度最多len的部分作为字符串的初值
s.~string(); 销毁所有字符,释放内存
代码实例: #include #include using namespace std; //20200527 测试字符串操作 int main() { string s1; cout <
s.insert(p,t); 在迭代器 p 指向的元素之前插入一个值为 t 的新元素,返回指向新插入元素的迭代器
s.insert(p,n,t); 在迭代器 p 指向的元素之前插入 n 个值为 t 的新元素
s.insert(p,b,e); 在迭代器 p 指向的元素之前插入迭代器 b 和 e 标记范围内所有的元素。返回 void
s.assign(b,e); 在迭代器 b 和 e 标记范围内的元素替换 s。string类型,返回 s;容器类型返回 void
s.assign(n,t); 用值为 t 的 n 个副本替换 s。对于 string 类型,该操作返回 s;对于容器类型,则返回 void
s.erase(p); 删除迭代器 p 指向的元素。返回一个迭代器,指向被 删除元素后面的元素
s.erase(b,e); 删除迭代器 b 和 e 标记范围内所有的元素。返回一个迭代器,指向被删除元素段后面的第一个元素
代码实例: #include #include using namespace std; //2020.05.27 测试字符串操作 int main() { string s(hello); string s2(abcdef); string::iterator p = s.begin(); //迭代器p s.insert(p,'a'); //在迭代器p指向的s开始之前插入a cout << s << endl; //s为ahello s.insert(p,3,'b'); //p指向返回的ahello的a处,在a之前插入3个b cout << s << endl; //s为bbbahello string::iterator b = s2.begin(); //迭代器b string::iterator e = s2.end(); //迭代器e //p = s.begin(); //p指向s s.insert(p,b,e); //在p指向的s之前插入b和e迭代器范围内的元素abcdef cout << s << endl; //s为abcdefbbbahello s = hello; cout << s << endl; //s为hello s.assign(b,e); //s所有的元素倍替换为b到e之间的元素,b与e之间为s2 cout << s << endl; //s为abcdef s.assign(8,'k'); cout << s << endl; //s为kkkkkkkk p = s2.begin(); //迭代器p指向s2的a s2.erase(p); //删除迭代器p指向的元素a cout << s2 << endl; //s2为bcdef p = s2.begin(); //a被删除,p指向b p++; //指向c p++; //指向d string::iterator p2 = s2.end(); //p2迭代器指向f p2--; //指向e s2.erase(p,p2); //删除p指向的d和p2指向的e之间的元素 cout << s2 << endl; //s2为bcf return 0; }运行结果: 运行结果string 类型特有的版本: string以数组的形式存储,可以用数组的下标进行修改操作: string 修改操作方法 说明
s.insert(pos,n,c); 在下标 pos 的元素之前插入 n 个字符 c
s.insert(pos,s2); 在下标 pos 的元素之前插入 string 对象 s2
s.insert(pos,s2,pos2,len); 在下标为 pos 的元素之前插入 s2 中从下标 pos2 开始的 len 个字符
s.insert(pos,cp,len); 在下标为 pos 打元素之前插入 cp 所指向数组的前len 个字符
s.insert(pos,cp); 在下标为 pos 的元素之前插入 cp 所指向的以空字符结束的字符串副本
s.assign(s2); 用 s2 的副本替换 s
s.assign(s2,pos2,len); 用 s2 中从下标 pos2 开始的 len 个字符替换 s
s.assign(cp,len); 用 cp 所指向数组的前 len 个字符副本替换 s
s.assign(cp); 用 cp 所指向的以空字符结束的字符串替换 s
s.erase(pos,len); 删除从下标 pos 开始的 len 个字符
代码实例: #include #include using namespace std; //2020.05。27 测试字符串操作 int main() { string s(hello); string s2(abc); s.insert(0,3,'a'); //在s下标是0之前插入3个a cout << s << endl; //s为aaahello s.insert(5,s2); //在aaahello下标是5的元素之前插入abc cout << s << endl; //s为aaaheabcllo s2 = 123456; s.insert(0,s2,2,3); //在s的下标是0之前插入s2下标为2开始往后的3个元素345 cout << s << endl; //s为345aaaheabcllo char *cp = stately plup buck; s.assign (cp,7); cout << s << endl; //s为stately s.assign(cp); //没有长度,默认是拷贝全部 cout << s << endl; //s为stately plup buck s = hello; s.insert (0,cp,7); cout << s < s.find( args); 在 s 中查找 args 的第一次出现
s.rfind( args); 在 s 中查找 args 的最后一次出现
s.find_first_of( args); 在 s 中查找 args 的任意字符的第一次出现
s.find_last_of( args) ; 在 s 中查找 args 的任意字符的最后一次出现
s.find_first_not_of( args); 在 s 中查找第一个不属于 args 的字符
s.find_last_not_of( args); 在 s 中查找最后一个不属于 args 的字符
代码实例: #include #include using namespace std; //2020.05.27 测试字符串操作 int main() { string name(annabelle); string::size_type pos1 = name.find(bell); cout << pos1 << endl; //返回下标4,如果没找到返回npos if(pos1 == string::npos) cout << 没找到! << endl; else cout << 找到了!下标: << pos1 < str1.compare(m,n,str2); str1的子串(从索引m开始,包含n个字符)与str2进行比较
str1.compare(m,n,str2,m,n); str1的子串(从索引m开始,包含n个字符)与str2的子串(从索引m开始,包含n个字符)进行比较
代码实例: #include #include #include using std::cout; using std::endl; using std::cin; using std::string; int main(void) { string str1=hi,test,hello; string str2=hi,test; //字符串比较 if(str1.compare(str2)>0) printf(str1>str2 ); else if(str1.compare(str2)<0) printf(str1
AndroidQBeta4体验 一些老生常谈的问题已经有了比较积极的解决方案
只凭一款车型笑傲群雄的新能源车企
研究团队设计出一种突破性的液晶镜头
使用晶体管的逻辑门条件
基于DSP的抖动测量的方案设计
字符串string对象操作的全面总结
索尼拟打造新型AI机器人厨师
骨传导耳机音质怎么样_骨传导耳机体验
小米mix就问你怕不怕?诺基亚8:全面屏+渲染图+前置指纹完美碾压
简单归纳PCB设计时的一些常见错误
荣耀手环4推1.0.10.58更新 加入三个新特性
汽车红外遥控系统发射器与接收机原理介绍
联发科技推出具高速边缘AI运算能力的i700解决方案 助推AIoT商业端发展
苹果iPhone代工厂因新资问题发生暴力事件
科普脉冲编码器的结构及工作原理
当出现iOS升级推送时,你是选择更新还是不更新?
基于物通博联工业智能网关的水务环保监测预警系统
便携式测试设备可判断饮用水中有毒重金属
Hashgraph能弥补人工智能、区块链和工业4.0之间的差距技术的所有特征
Linear推出微型模块模数转换器LTM9012