【C++】 String 常用操作:增删查改 | 查找 | 截取 | IO

【C++】 String 常用操作:增删查改 | 查找 | 截取 | IO 相关专栏【Linux专栏】【C语言专栏】【测试专栏】【MySQL专栏】【C 专栏】 相关文章推荐【C】深度实战模拟 String 类全部核心操作【C】C动态内存管理new / delete完全指南【Linux】 传输层协议UDP从端口号到传输机制【测试】一文读懂软件测试新手真正需要的测试认知很高兴你点开这篇文章✨这里会持续更新我喜欢的内容关注我一起慢慢变好呀 点赞 ⭐ 收藏 评论文章目录前言1. 尾部追加 / push_back / append2. 指定位置插入insert3. 指定位置删除erase4. 字符串替换replace5. 字符串查找find6. 子串截取substr7. C风格转换c_str8. 整行输入getline总结本文所有代码 test.cpp前言C 的 std::string 不仅提供了基础的存储和遍历功能还封装了大量实用的字符串操作接口——追加、插入、删除、替换、查找、截取等。熟练掌握这些接口可以让我们在处理字符串时避免自己造轮子写出更简洁、更安全的代码。 ✨ 1. 尾部追加 / push_back / appendstring 提供了三种常见的尾部追加方式strings1(hello qianyv);// 1. push_back追加单个字符s1.push_back(a);couts1endl;// hello qianyva// 2. append追加多个相同字符 或 字符串s1.append(10,x);// 追加10个 xcouts1endl;s1.append(abc);// 追加字符串 abccouts1endl;// 3. 运算符最推荐写法简洁strings2(nihao qianyv);s2 ;// 追加单字符s2hello;// 追加字符串couts2endl;// nihao qianyv hello注意三种方式中 运算符最直观推荐日常使用。push_back 适合单字符追加append 适合批量追加。 ✨ 2. 指定位置插入insertinsert 可以在任意位置插入字符或字符串有多种重载形式strings2(hello qianyv);// 头插字符串s2.insert(0,nihao);couts2endl;// nihaohello qianyv// 指定位置之前插入字符串s2.insert(2,ma);couts2endl;// nima haohello qianyv// 插入 n 个相同字符s2.insert(7,1,b);couts2endl;// nima haobhello qianyv// 使用迭代器插入头插单字符s2.insert(s2.begin(), );couts2endl;// nima haobhello qianyv注意insert(pos, n, char) 中 n1 时相当于插入单字符但不能省略 n 参数。迭代器版本的 insert 可以与 begin()/end() 配合使用。 ✨ 3. 指定位置删除eraseerase 用于删除指定位置或指定范围的字符strings3(nihao hello qiany);// 头删删除下标 0 位置开始的 1 个字符s3.erase(0,1);couts3endl;// ihao hello qiany// 尾删删除最后一个字符s3.erase(s3.size()-1,1);couts3endl;// ihao hello qian// 删除多个字符从下标 3 开始删 5 个s3.erase(3,5);couts3endl;// iha qian// 只给一个参数从该位置删到末尾s3.erase(3);couts3endl;// iha注意erase(pos, len) 中 len 的缺省值是 npos通常为 -1代表删除到末尾。也可以用迭代器版本erase(begin()) 头删erase(end() - 1) 尾删。 ✨ 4. 字符串替换replacereplace 可以替换指定位置的字符或子串strings4(hello qianyv);// 将下标 5 位置的 1 个字符替换成 as4.replace(5,1,a);couts4endl;// hello a qianyv// 将下标 5 位置的 1 个字符替换成 ***少换多会涉及字符移动s4.replace(5,1,***);couts4endl;// hello *** qianyv实战将所有空格替换为 *// 方法1使用 find replacestrings5(hello world a b c d);size_t poss5.find( );while(pos!string::npos){s5.replace(pos,1,*);poss5.find( ,pos1);}couts5endl;// hello*world*a*b*c*d// 方法2空间换时间更高效strings6(hello world a b c d);string tmp;tmp.reserve(s6.size());// 预分配空间避免频繁扩容for(autoch:s6){if(ch )tmp*;elsetmpch;}s6.swap(tmp);// 交换比 s6 tmp 更高效couts6endl;// hello*world*a*b*c*d注意replace 适合少量替换大量替换时用“空间换时间”的方法遍历追加到新串效率更高配合 reserve 预分配空间可进一步优化。swap 比直接赋值效率高只交换内部指针。 ✨ 5. 字符串查找findfind 用于查找字符或子串返回第一次出现的位置找不到则返回string::nposstrings5(nihao qianyv);// 查找字符 osize_t pos1s5.find(o);if(pos1!string::npos){couto在位置pos1endl;// o在位置3}// 查找子串 qianyvsize_t pos2s5.find(qianyv);if(pos2!string::npos){coutqianyv在位置pos2endl;// qianyv在位置6}// 从下标 5 开始查找字符 osize_t pos3s5.find(o,5);couto在位置pos3endl;// 找不到返回 npos通常为 -1注意string::npos 是 size_t 类型的最大值通常为 -1 的无符号表示作为“未找到”的返回值。第二个参数指定起始搜索位置。 ✨ 6. 子串截取substrsubstr(pos, len) 从 pos 位置开始截取 len 个字符不指定 len 则截取到末尾string s6nihao qianyv;// 从下标 5 开始取到末尾不传第二个参数string sub1s6.substr(5);coutsub1endl;// qianyv注意前面有个空格// 从下标 2 开始取到末尾string sub2s6.substr(2);coutsub2endl;// hao qianyv注意substr 不会修改原字符串而是返回一个新字符串。第二个参数若超过字符串长度会自动截取到末尾。 ✨ 7. C风格转换c_strc_str() 返回一个 const char* 指针指向以 ‘\0’ 结尾的 C 风格字符串用于适配 C 语言库函数#includecstringstring s7nihao qianyv;// 1. printf 输出printf 不直接支持 stringprintf(%s\n,s7.c_str());// nihao qianyv// 2. 调用 C 库函数 strlensize_t lenstrlen(s7.c_str());coutlenendl;// 13注意当需要与 C 语言接口如 printf、strlen、文件操作等交互时c_str() 必不可少。返回的指针指向内部字符数组但不应修改它。 ✨ 8. 整行输入getlinecin string 或 scanf 读取字符串时遇到空格就会停止。getline 可以读取一整行包括空格voidtest_string8(){string s9;// 不传第三个参数则默认以换行符结束// 下面指定终止符为 *遇到 * 才停止读取getline(cin,s9,*);}注意getline 的第三个参数可以指定自定义终止符默认是 \n。它可以读取带空格的整行内容常用于处理用户输入的完整句子。 ✨ 总结操作核心接口尾部追加、push_back、append插入insert删除erase替换replace查找find截取substrC风格转换c_str整行输入getline ✨ 本文所有代码 test.cpp#define_crt_secure_no_warnings1#includeiostream#includestringusingnamespacestd;////尾部追加////尾部追加---operator /push_back/appendvoidtest_string1(){strings1(hello qinayv);s1.push_back(a);//push_back-尾插单字符couts1endl;s1.append(10,x);//尾插10个xcouts1endl;s1.append(abc);//尾插字符串“abc”couts1endlendl;strings2(nihao qianyv);//用 更方便s2 ;s2hello;couts2endl;}intmain(){test_string1();return0;}//////////////////////////////////////////////////////////////////////////////////////插入和删除---inser指定位置插入voidtest_string2(){strings2(hello qianyv);//inser(pos,)———pos是下标//头插s2.insert(0,nihao);couts2endl;//指定位置之前插入s2.insert(2,ma);couts2endl;//string inser(size_t pos,size_t n,char c)//n1时插入n个字符n1时相当于插入单个字符但不能没有n;s2.insert(7,1,b);couts2endl;s2.insert(s2.begin(), );couts2endl;}intmain(){test_string2();return0;}///////////////////////////////////////////////////////////////////////////////////插入和删除---erase指定位置删除voidtest_string3(){strings3(nihao hello qiany);couts3endl;//删除数据//string erase(size_t pos 0, size_t len npos);//iterator erase(iterator p);---迭代器用法//头删数据//erase(pos,n)-pos下标n个数s3.erase(0,1);//迭代器用法erase(begin());couts3endlendl;//尾删数据s3.erase(s3.size()-1,1);//迭代器用法erase(end());couts3endlendl;//删除多个数据s3.erase(3,5);couts3endl;s3.erase(3);//若不给第二个实参则len默认给缺省值npos,即删除对应位置后面的全部数据couts3endl;}intmain(){test_string3();return0;}//////////////////////////////////////////////////////////////////////////////////////字符串替换replace()-修改指定位置的内容voidtest_string4(){strings4(hello qianyv);couts4endlendl;s4.replace(5,1,a);couts4endlendl;s4.replace(5,1,***);//将下标为5位置的字符替换为***由于是少的字符替换成多字符//说明需要到前面insert的逻辑讲后面的字符往后移动//练习:将所有空格替换为*////1.用find查找strings5(hello world a b c d);size_t poss5.find( );while(pos!string::npos){s5.replace(pos,1,*);poss5.find( ,pos1);}couts5endl;//但是我们发现上面这种方法会比较麻烦每次只能找一个空格替换成*//2.空间换时间strings6(hello world a b c d);string tmp;tmp.reserve(s6.size());for(autoch:s6){if(ch ){tmp*;}else{tmpch;}}//s6tmp;---最后赋值给s6//也可以使用string中的swaps6.swap(tmp);couts6endl;}intmain(){test_string4();return0;}//////////////////////////////////////////////////////////////////////////////////////////字符串查找---find():找字符/子串voidtest_string5(){strings5(nihao qianyv);//找字符:osize_t pos1s5.find(o);if(pos1!string::npos){couto在位置pos1endlendl;}//找字串:qianyvsize_t pos2s5.find(qianyv);if(pos2!string::npos){coutqianyv在位置pos2endlendl;}//从下标n开始找字符osize_t pos3s5.find(o,5);couto在位置pos3endlendl;}intmain(){test_string5();return0;}/////////////////////////////////////////////////////////////////////////////////////////////字串截取---substr():从指定位置取指定长度voidtest_string6(){string s6nihao qianyv;//1.从第6个位置开始取5个字符string sub1s6.substr(5);coutsub1endlendl;// qianyv (前面是个空格)//2.从位置2开始取到末尾——没给第二个参数string sub2s6.substr(2);//hao qianyvcoutsub2endl;}intmain(){test_string6();return0;}//////////////////////////////////////////////////////////////////////////////////////////////c字符转换---c_str()用来适配c语言库函数#includecstringvoidtest_string7(){string s7(nihao qianyv);//1.printf输出printf不直接支持string要转换printf(%s\n,s7.c_str());//2.调用c库函数strlen---需要包含头文件 cstringsize_t lenstrlen(s7.c_str());coutlenendlendl;}intmain(){test_string7();return0;}////////////////////////////////////////////////////////////////////////////////////////////整行输入---getline读取带空格的字符能读取一整行// cinstring或scanf 读取字符时读到空格就会停止getline不会voidtest_string8(){string s9;//空串//不传第3个实参则默认回车结束可以指定终止符,下面指定终止符是*getline(cin,s9,*);}intmain(){test_string8();return0;}欢迎留言交流​期待你的评论与建议​留下你的想法吧谢谢你看到这里呀如果喜欢这篇内容点个关注下次更新不迷路✨ 点赞 ⭐ 收藏 评论