|
字符串操作看似简单,其实非常重要,不注意的话,经常出现代码运行结果和自己想要的不一致,甚至崩溃。本文总结了一些构建string对象方法、修改string对象的方法、string类型的操作函数、string类型的查找、string对象的比较。 1 构建string对象方法首先,为了在我们的程序中使用string类型,我们必须包含头文件 。如下: #include <string> 声明一个字符串变量很简单: string Str; 这样我们就声明了一个字符串变量,但既然是一个类,就有构造函数和析构函数。上面的声明没有传入参数,所以就直接使用了string的默认的构造函数,这个函数所作的就是把Str初始化为一个空字符串。 String类的构造函数和析构函数如下: [td]
代码实例: #include <iostream>#include <string>3 _2 E# {* I# E" x5 O* b+ r& A3 p using namespace std; //20200527 测试字符串操作 C语言与CPP编程* D' b# l2 E1 t: g, X& J 3 b0 ~& O. R R+ w int main() { string s1; cout <<s1 << endl; //没有赋值输出为空; y( r" p" I i1 I! `/ Q string s2(10,'f'); cout <<s2 << endl; //用10个f定义字符串s2,输出ffffffffff string s3(s2);9 Y) G }, ?1 Y, {" v# M/ {* t- A cout <<s3 << endl; //用s2定义上,将s3拷贝给s2,s2和s3是不同的字符串, //只是构造的时候拷贝s2,修改其中一个不会影响另一个,s3输出位ffffffffff ?4 M7 P0 t0 X, b string s4(s3.begin(),s3.begin()+(s3.size())/2); //定义s4用迭代器做参数,从第一个迭代器s3.begin() cout <<s4 << endl; //到第二个迭代器s3的一半即s3.size()/2结束,s3有10个f,s4输出为fffff! X. @8 N: Q4 {: C ' N& z! y3 J: i& D q char *cp = "Hello"; //最后有空字符/05 z9 h" q- T" I$ `# G char c_array[] = "world!!!!"; //最后有空字符/07 c$ p1 ]. ?; m2 B/ k8 K1 _ char no_null[] = {'H','e','l','l','0'}; //最后没有空字符/0,不算C语言字符串,只是字符数组 + [7 z' G! ?0 _3 v7 a string ss1(cp); cout <<ss1 << endl; //cp指向的字符串一个一个拷贝到ss1对象里,ssl输出为Hello0 G: A" ]5 S+ t7 f: @- F1 D - H0 T% m, M8 m! U: Z string ss2(c_array,5);7 Z0 p! m! A7 V( t8 | cout <<ss2 << endl; //c_array数组名就是指向第一个字符w的指针,从w开始取5个,ss2为world string ss3(c_array+5,4); cout <<ss3 << endl; //c_array+5指向第五个字符d,再取4个字符,ss3为!!!!+ W7 x4 |2 u1 l //string ss4(no_null);//用字符数组为ss4赋值,因为找不到/0,不知道拷贝几个会出错 string ss5(no_null,2); //这次取2个就知道什么时候结束,不会出错8 v( m' Y6 N9 ?3 B0 c4 q5 o) F cout <<ss5 << endl; //ss5为He4 w; ^$ }5 O1 z s1 = "Hello"; cout << s1 << endl; //s1输出Hello ! M: i; w( F! F( y string s6(s1,2); cout << s6 << endl; //用s1初始化s6,2表示字符下标,从第二个字符开始到最后,s6为llo/ h( n' S$ l9 r. s1 J; ^% D! G$ m) e string s7(s1,0,2); cout << s7 << endl; //从s10开始取2个,s7为He6 L+ V3 Z% i2 K; K6 {. \3 l string s8(s1,0,8); cout << s8 << endl; //从s1的第一个开始取8个,不够8个就结束,s8为Hello7 z7 ] d* i+ r( d6 E7 J - L$ A( E# Y4 e" @7 d return 0; } ** 运行结果**:
与容器共有的 string 操作: [td]
代码实例: #include <iostream>! g0 e$ r! k* p5 \- V#include <string>; [- F# _" B; T/ r: [1 u4 Z using namespace std;' Z2 k3 Z! N7 K //2020.05.27 测试字符串操作 公众号:C语言与CPP编程 int main()* g$ B {; \. b3 l6 } {$ }. V8 N8 c! X. f string s("hello"); string s2("abcdef"); * V3 B/ N8 ~6 e% ]' a- z3 H string::iterator p = s.begin(); //迭代器p s.insert(p,'A'); //在迭代器p指向的s开始之前插入A cout << s << endl; //s为Ahello' h O/ s J& L! `/ m - k( M6 @7 [, T: Z1 m! k s.insert(p,3,'B'); //p指向返回的Ahello的A处,在A之前插入3个B; \4 J+ T7 `; n cout << s << endl; //s为BBBAhello' J4 o2 k# f( x0 o) @+ ^, z & I# A& F9 j9 S1 E string::iterator b = s2.begin(); //迭代器b string::iterator e = s2.end(); //迭代器e( l3 N. h4 x& R: L //p = s.begin(); //p指向s s.insert(p,b,e); //在p指向的s之前插入b和e迭代器范围内的元素abcdef cout << s << endl; //s为abcdefBBBAhello 7 D7 w+ |" O/ e- R% S5 m; l s = "hello";" D* n z* q$ p7 G$ b) m cout << s << endl; //s为hello s.assign(b,e); //s所有的元素倍替换为b到e之间的元素,b与e之间为s2! R0 V6 B5 t7 E$ U+ Z+ M/ A cout << s << endl; //s为abcdef7 y4 U& ^5 R2 ?5 X s.assign(8,'K'); cout << s << endl; //s为KKKKKKKK3 Z7 ^; ^7 Q/ ? + A. U+ }3 O: y3 _! ?& W p = s2.begin(); //迭代器p指向s2的a s2.erase(p); //删除迭代器p指向的元素a cout << s2 << endl; //s2为bcdef7 I; R2 ?& \- a7 W/ b- V, {5 d p = s2.begin(); //a被删除,p指向b p++; //指向c0 o8 M6 F3 s$ z& g: g7 b p++; //指向d string::iterator p2 = s2.end(); //p2迭代器指向f p2--; //指向e s2.erase(p,p2); //删除p指向的d和p2指向的e之间的元素 cout << s2 << endl; //s2为bcf3 |# H: F% a: i6 n5 ?6 `. h9 g& v + `5 L: }5 h( k# L3 x0 P0 x: f return 0;1 @* n3 n. [. v& E! o } 运行结果:
string 类型特有的版本: string以数组的形式存储,可以用数组的下标进行修改操作: [td]
代码实例: #include <iostream>2 j+ J$ B9 q9 H#include <string>3 i* i$ U; d/ W $ u% ?3 g3 L; |" Q: U( T: G* j using namespace std;! p+ y% j+ H2 ]; J0 n& o //2020.05。27 测试字符串操作 公众号:C语言与CPP编程 int main() {; ` c0 b- \+ K8 G Y' ] string s("hello"); string s2("abc");& F( O: a- P2 d1 E4 z s.insert(0,3,'A'); //在s下标是0之前插入3个A cout << s << endl; //s为AAAhello s.insert(5,s2); //在AAAhello下标是5的元素之前插入abc- T' ?# R0 C6 p cout << s << endl; //s为AAAheabcllo s2 = "123456";3 o5 v [: \ v; p) p- S# J s.insert(0,s2,2,3); //在s的下标是0之前插入s2下标为2开始往后的3个元素345" D; h6 z( Q& M% }: r cout << s << endl; //s为345AAAheabcllo * p# V1 ~4 R& F3 D C* [2 E) ]9 {/ c char *cp = "Stately plup Buck"; v# b9 R! J. Z' h: c4 a3 j s.assign (cp,7); cout << s << endl; //s为Stately* s: J( `0 _2 I0 j4 ^ s.assign(cp); //没有长度,默认是拷贝全部, V: Y7 M* k$ O cout << s << endl; //s为Stately plup Buck+ n% R: E3 T5 G s = "hello"; s.insert (0,cp,7); cout << s <<endl; //s为Statelyhello! l( d/ \2 A* W$ E% r' O9 h $ o+ C- y: u( a7 R3 N- Q5 | s.insert(0,cp); cout << s <<endl; //s为Statelyhello2 B! \2 Q k2 x+ _4 Z 1 U1 b! ?0 P9 i; f4 \ s = "hello"; s2 = "abcdef"; 2 v$ @* \- q g6 P7 i% E& n3 G7 F s.assign(s2,2,3); //s2中下标为2开始3个元素赋值给s; cout << s <<endl; //s为cde1 {/ J! I( o H0 ^ % D7 N! ^8 N9 E$ o. B) y s.assign(s2); cout << s <<endl; //s为abcdef* i, Q3 q7 `9 Z$ M7 {2 {% d 8 Q7 ~, Y A |! b9 g" L s.erase (2,3); //从下标为2开始删除s中的3个元素' a# d0 u: b1 s5 j; l' z: F# R. B; t3 I cout << s <<endl; //s为abf 7 O) E! B1 C9 g0 y5 J) v: _ s = "123456789";* c8 G* N& E3 q s.erase(s.size()-5,5); //删除s中后5个4 e5 K. ]' {8 e6 Y cout << s <<endl; //s为1234! i% h* v# r2 {; Z6 b, I 5 N3 b+ f# X; G% I s.insert(s.size(),5,'!'); //在s下标为s.size()处,插入5个!0 ]. v. K; [0 ]$ @4 S cout << s <<endl; //s为1234!!!!!+ q. Z# x2 {) g& q& b s = "abc"; s.erase(0,1).insert(0,"A"); //先从下标为0之前删除一个a为bc,再插入A cout << s <<endl; //s为Abc, r7 S8 w2 A: G6 y* j# h% q s = "abc";; {4 D% g) m D; X s[0] = 'A'; //用数组的方式处理7 i) X- E+ w5 ~9 o8 a cout << s <<endl; //s为Abc- k& M& H. S/ p; |1 d/ P ; u+ W% R( f* h/ @& H) r% o8 B- F return 0; }8 @. _/ |* D8 B3 O$ L 运行结果:
, l! \8 D) u4 @0 r1 G+ Z 3 适合string类型操作的函数
代码实例: #include <iostream>0 M* n4 [! ?$ C8 q" P#include <string> q( T. k1 Z4 @8 Q! \ s using namespace std;- _" q3 `5 G4 K4 u" o //2020.05.27 测试字符串操作 公众号:C语言与CPP编程3 M! u: V' t& }! Z 2 T2 I/ }0 G$ u# A' { int main()7 E4 F) U: e0 s- F$ X/ P( l { string s("Hello world"); string s2 = s.substr(6,5); //从第6个开始取5个5 ]( C9 l6 {2 A) l* V/ |- p5 c cout << s2 << endl ; //s2为world s2 = s.substr(6); //从第6个开始取拷贝所有的 cout << s2 << endl ; //s2为world) ^- H0 K* n- l( A9 @ 6 ?" x. ^4 f7 f1 L1 U s2 = s.substr(6); //s2拷贝s的全部,相当于s2=s cout << s2 << endl ; //s2为Hello world ) z$ _8 f+ `. t0 B T; ~6 t s = "C++ Primer";: ]* k+ x$ @4 }% V! W; U s.append(" 3rd Ed"); //再s最后添加3rd Ed cout << s<< endl ; //s为C++ Primer 3rd Ed% e. w! ]1 @ }( a b* \$ X # g' u& }8 ~' G/ I1 K6 v s = "C++ Primer"; s.insert(s.size()," 3rd Ed"); //最后插入 cout << s<< endl ; //s为C++ Primer 3rd Ed / U, L# B, A# R6 e4 p8 _ s.replace(11,3,"4th"); //下标11开始3个替换4th cout << s<< endl ; //s为C++ Primer 4th Ed4 m G2 ?! N9 y. m* t s.replace(11,3,"Fourth"); //下标11开始3个替换Fourth cout << s<< endl ; //s为C++ Primer Fourth Ed - E, N5 l6 @& C s = "C++ Primer 3rd Ed"; //replace相当于先删除后插入; i$ F* `6 U* _! q4 G7 w5 h s.erase (11,3); //删除3rd( e2 ~" D% T4 V. U2 E s.insert(11,"Fourth"); //插入Fourth2 ~+ z; p5 L% ^! P cout << s<< endl ; //s为C++ Primer Fourth Ed3 r. f! I; }& ~0 A* V0 T J( X2 M# ^3 o* y return 0;- a# C! ~: M, A# T } 运行结果:
* G# _/ ?5 U! c# e& I6 h! k; w$ b# I 4 string类型的查找[td]
代码实例: #include <iostream>+ N. K$ z$ _( z* b* Y#include <string> 6 Y! g3 @6 R. t' Y3 _% N using namespace std;0 @# F" @) `3 H R$ D' R1 Q //2020.05.27 测试字符串操作 公众号:C语言与CPP编程 ' t" ]! Q4 C) j# K# b int main()- |: @% b4 F$ w. j; M0 ~ Z m { string name("AnnaBelle"); string::size_type pos1 = name.find("Bell"); cout << pos1 << endl; //返回下标4,如果没找到返回npos$ G' l. {3 e# [& k1 l8 s ! K/ `# V7 q9 J; f `/ Y if(pos1 == string::npos) cout << "没找到!" << endl;) g" k% _1 l! ^. [ Z else# O( W: S7 w+ z9 o. m- U5 d& F4 _) Z cout << "找到了!下标:" << pos1 <<endl; H( T8 \- E5 b; S' k: B name = "2sn3"; string numerics("0123456789"); n/ V3 t0 e9 u string::size_type pos = name.find_first_of(numerics); //在2sn3中查找0123456789中任意一个第一次出现 if(pos == string::npos)* W: L5 o: _2 R; z' ] cout << "没找到!" << endl;9 D! M0 Q: d3 n7 J( U1 y" a else, X( w2 \3 q6 ?& R/ g3 B: }7 g4 M cout << "找到了!下标:" << pos <<endl; //找到了!下标:0 //其他类型的查找这里就不举例子了( N6 o7 @7 W% h4 J : R; L3 ^5 H* `+ U8 m return 0; }/ x# J: W; {* O5 D/ ?: i5 x 运行结果:
, C, |& Q0 p/ w0 B/ l% d, t4 m- e" t : Q4 q' |# ^, G {/ Z 5 string对象的比较[td]
代码实例: 2 J# C+ D# y, b8 \; q#include <iostream> #include <string> #include <cctype> using std::cout; using std::endl;+ y4 r( ?& b6 w using std::cin; using std::string; int main(void) { string str1="hi,test,hello";" r: P9 w& q4 H8 f1 [6 O* h string str2="hi,test"; //字符串比较) n: j5 h# b$ P6 G0 { if(str1.compare(str2)>0)2 b) y0 j4 ]( i printf("str1>str2\n");. e+ @7 ~" T- Q else if(str1.compare(str2)<0); `+ G5 e! n" s2 d6 h printf("str1<str2\n");2 K) M/ r) q( H1 R6 |9 |0 [ else printf("str1==str2\n"); //str1的子串(从索引3开始,包含4个字符)与str2进行比较( k7 T% U/ T" ] if(str1.compare(3,4,str2)==0)) z3 ^ Z5 V, [" t printf("str1的指定子串等于str2\n"); else+ C: U0 e$ z6 S O; O: V8 { printf("str1的指定子串不等于str2\n"); //str1指定子串与str2的指定子串进行比较; E- t) h% O2 w# Y+ E$ F if(str1.compare(3,4,str2,3,4)==0)" x$ p6 F, ^7 X9 i; N7 A printf("str1的指定子串等于str2的指定子串\n"); else, Q# ]* i$ h5 k' m printf("str1的指定子串不等于str2的指定子串\n"); 4 Z& K& k6 g. |+ a3 ^( ? //str1指定子串与字符串的前n个字符进行比较: v4 t2 k. ]5 h6 i V if(str1.compare(0,2,"hi,hello",2)==0) printf("str1的指定子串等于指定字符串的前2个字符组成的子串\n");8 D8 ^9 R* C- F7 r# E/ Z, F else printf("str1的指定子串不等于指定字符串的前2个字符组成的子串\n"); return 0; ' `0 {* q& X/ ~( ?3 V }3 O5 b' r: s* Z1 O; b1 y: t 运行结果:
运行结果 ( q! m# H: S/ \7 c |
微信公众号
手机版