你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

string容器详解

[复制链接]
gaosmile 发布时间:2020-10-6 21:33

一、string基本概念:

1、本质

string是c++风格的字符串,而string本质上是一个类。

2、string和char *的区别

-char *是一个char类型的指针类型

-string是一个类,类内部封装了char*,是一个char型的容器。string类内部封装了很多成员函数,比如:查找find,拷贝copy,删除delete,替换replace,插入insert;string管理char所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责

二、string构造函数:

构造函数原型:

  • string();//创建一个空的字符串,例如string str

  • string(const char* s);//使用字符串s初始化

  • string(const string& str);//使用一个string对象初始化另外一个string对象,就是拷贝构造函数

  • string(int n, char c);//使用n个字符c初始化


    0 G  r& m# n+ m% r9 B% t' G6 \! U

代码应用举例:

#include <iostream>
* ~1 u5 _0 P3 ]: J#include <string># \# O* F: x# s1 i) G' z
using namespace std;
7 E  O( n+ H& R$ y" E! n5 Q
% w! T( ]. w$ q/ vvoid test()
* \& L( n/ k3 M  o! h% c' Q{
1 U$ W: Q- r. o6 Y2 ?. h   string s1;8 K9 Z5 g  t9 o- ^
7 s0 c6 y1 _! K7 j+ q- @3 X
   const char *str = "txp";) I" j+ Y6 b& a' L7 v
   string s2(str);
. ^' C" _; A$ X. W# d
/ J9 f2 y2 A2 h5 _   cout << "s2= "<<s2<<endl;
& ]0 n( m* N- \' i) _, i2 J% z9 N9 n7 F
   string s3(str);: S0 `4 \# S0 X' f8 @: J! I! W
   cout <<"s3= "<<s3<<endl;5 U! v9 p9 m# i3 d2 |
1 z  r0 V) s, z8 U0 ]/ m# A
   string s4(10,'a');1 ]$ h! l) @6 v" Y; g& j7 g
   cout <<"s4= "<<s4<<endl;
& \3 x3 k- ~, k. |6 C}
* i4 a: ~: A. s' Q, i) ]int main()
1 q' ?; ~9 u! W: z) F3 d9 ]/ W{2 B5 [% s+ H* W$ Q/ C3 u, M& R
    test();
# c* o' s0 Y) |# m, e" o}
4 b9 J0 ]  H: o1 W" ?/ `5 ~
3 o# V6 |5 Y4 H, U) A

输出结果:

root@txp-virtual-machine:/home/txp/test2# ./a.out0 e) T" a2 z  H2 N% d/ |3 f2 y
s2= txp5 Y- d! n  Z& t2 ^4 ~3 B+ Q: A- m1 Q
s3= txp, r( E6 V& G: t7 [7 e6 \
s4= aaaaaaaaaa
- u4 [6 ?6 `9 y  k! X3 Y2 g0 S- N- p1 Y( t. R: t

三、string赋值操作:

实现string字符串赋值的函数类型:

  • string &operator=(const char* s);//char *类型字符串赋值给当前的字符串

  • string &operator=(const string &s);//把字符串s赋给当前的的字符串

  • string &operator=char(c);//字符赋值给当前的的字符串

  • string& assign(const char *s);//把字符串s赋给当前的字符串

  • string& assign(const char *s,int n);//把字符串的前n个字符赋给当前的字符串

  • string& assign(const string &s);//把字符串s赋给当前字符串

  • string& assign(int n, char c);//用n个字符c赋给当前字符串


    7 X; u- K6 u) e

代码应用:

#include <iostream>
5 Z8 I9 {/ l6 f6 f# y5 J. G* }#include <string>, I( g+ M9 z% [# ]2 y7 a
using namespace std;
* u* v7 Q5 x( `4 \( G
3 P- c: @. t7 @% f6 Jvoid test()$ X0 I2 U" ?( B6 K; ~
{2 [* l/ M4 d. Q
   string str1;
+ }9 V4 T. F) c# @% Z+ L5 N   str1 = "txp";" S/ Z4 e( ?0 P
   cout<<"str1= "<<str1<<endl;
' W4 H$ s5 g  a+ y4 Q4 z
% U  {6 }& S8 H9 U% O1 J: t/ E4 I   string str2;
' W9 B8 y1 [. M* r1 n   str2=str1;# r1 }; @( H' f- y+ l$ Q
   cout<<"str2 = "<<str2<<endl;
3 Y( N/ b# n' ]" ^
5 L6 ?1 T6 v5 i! w8 u' K   string str3;
$ p4 g) w+ L5 m0 ^: d- I5 o( A   str3='a';5 m5 M1 N! \$ `1 d
   cout<<"str3= "<<str3<<endl;
9 n) _8 q+ z) w; q
& A, x6 l! h0 Q' z1 a   string str4;7 a) b' o( r5 x
   str4.assign("txp like cpp");
* [8 U5 I6 R+ G4 Q# l! j$ J   cout<<"str4= "<<str4<<endl;* p, s0 J9 W6 D& \* _0 ^

: c1 B! l! a1 `" Q. Q   string str5;$ _- K+ O! k1 E2 T: V$ G+ T2 I. p
   str5.assign("txp like cpp",5);
! ~0 c6 V" \' \. q4 V9 S   cout<<"str5= "<<str5<<endl;
1 T3 [: ~$ p" j9 ~" ]' n$ ^1 }# `1 j3 V
   string str6;
7 F* q3 ^; w+ C$ z# C) ^   str6.assign(str5);
% p4 V) V" |. a8 R8 m   cout<<"str6= "<<str6<<endl;# X5 h/ l7 \' L. d# x
" E& E- q/ E' c* ?1 N% |
   string str7;
  A: C. k- ~. J* M   str7.assign(10,'w');
$ C* G' D5 m9 ]* c& ^   cout<<"str7= "<<str7<<endl;
# K4 {* V! m* _1 B$ v
, A2 U6 D, d+ J. f}
- q9 @2 _- t5 J4 Q+ V8 K, b4 e. Z; K
* U% c, K" ]/ B  zint main()# d$ n# A, g; h& D5 D, ]
{8 A' |) y5 j, Q" p" L2 S2 r" v
  test();
, [6 y) o( O9 r}# ?/ g; r" g' Q% i# h$ Z

( w2 E8 L3 [" k& ^- e

结果输出:

root@txp-virtual-machine:/home/txp/test2# ./a.out
: d" V9 ^  d1 c! Pstr1= txp
3 S8 `  t( O, u% q1 w4 dstr2 = txp
1 |/ N% R/ ~7 ]* P5 Q% v3 kstr3= a
; w  [: Y  Y" ^; B4 J( ?# Lstr4= txp like cpp. u# _  E7 k' f- z
str5= txp l
- C' W  R: c+ Y2 ?; K, S4 e6 Fstr6= txp l1 J6 {) B+ p' t, R, ^7 E
str7= wwwwwwwwww
; [; X1 f( e4 S4 p6 v4 _9 \* B: p# r4 m) E0 l' E

四、string字符串拼接:

实现字符串末尾拼接字符串函数原型:

  • string& operator+=(const char* str);//重载+=操作符

  • string& operator+=(const char c);//重载+=操作符

  • string& operator+=(const string& str);//重载+=操作符

  • string& append(const char *s);//把字符串s连接到当前字符串结尾

  • string& append(const char *s,int n);//把字符串s的前n个字符连接到当前字符串结尾

  • string& append(const string &s);//同operator+=(const string& str)

  • string& append(const string &s,int pos,int n);//字符串s从pos开发的n个字符连接到字符串结尾


    0 B8 x( Y& W% o+ |9 s

代码应用:

#include <iostream>
9 `  y7 {& f8 E$ F#include <string>* T' P4 U2 w4 h' f' I, d0 l
using namespace std;
4 n" ]2 Z. G( e' y/ i$ d$ W  e4 P4 Q
6 I; K* S3 Z, m1 r$ rvoid test()
- ]6 U4 s* n0 \: e0 d1 j- [{. K& [% a- |3 r5 Z2 a% ?
   string str1 = "txp";
+ A* Q+ g- ]% N8 V; s; L   str1 += "xiaoping";0 B' e4 ^: l. Y: ~
   cout <<"str1= "<<str1<<endl;- C. }: ?/ `, Z

' j, O3 {5 I' a" Z   str1+=":";& _% G; A/ x+ {$ h: u" p
   cout<<"str1= "<<str1<<endl;$ [- O- w$ S' N3 r
* D3 b8 E9 A9 s/ T& ~
   string str2 = "cpp";% E6 L) O3 r7 i, L
   str1+=str2;
+ e! B  [9 c5 z. q   cout<<"str1= "<<str1<<endl;) h) t# L9 d) f$ z) k

- O2 x6 o7 ]+ l. K' X9 `; D   string str3 = "I";
  J0 {& A3 m4 g6 ^2 h   str3.append("love");4 n/ `) h# m9 k6 I% N+ ]: r
   cout<<"str3= "<<str3<<endl;3 d5 y0 C( g$ O
. ^. g2 C! E8 ?: w% [" {
   str3.append("game abcde",4);
! O: B' \: G. l* v- d   cout<<"str3= "<<str3<<endl;
7 `8 L) Z4 q# K) C( \1 J9 |$ ?4 f: |, G8 G! K/ e( ~4 m
   str3.append(str2);7 k) ], E- U' K& ]& M3 K: X) j
   cout<<"str3= "<<str3<<endl;
/ g& C/ f8 A8 m4 k4 R! ~/ Q1 M9 I& X0 i% l
   str3.append(str2,0,3);: l) j! S9 m  n% b6 K
   cout<<"str3= "<<str3<<endl;
: M) \; K3 P4 f" G; t0 \}
, v# R: R& r7 g5 \( w2 E' _
+ l% L0 j$ ^. bint main()! q% p3 D) X# t6 V6 E
{
+ c) J' w/ P) K5 ?  test();, P7 k: v& d- u1 J3 Q& R) t# Q1 l; W
}) J% [0 \3 Z, a7 m. x) h

+ L) Y6 v, u2 R& M
' _+ |5 p& ?; q% x  G4 \

结果输出:

root@txp-virtual-machine:/home/txp/test2# ./a.out+ N3 ~) ^& L* @: T5 n, {
str1= txpxiaoping
/ P7 V5 Y* C" ~$ k% s, ?5 d+ b5 Dstr1= txpxiaoping:8 [5 y  J5 [  F
str1= txpxiaoping:cpp! P5 {) m- H5 ]1 u+ N
str3= Ilove
% Q6 c1 H: [# E; mstr3= Ilovegame
' X* J8 O. C/ `4 p; ~str3= Ilovegamecpp1 R4 l) _, m9 V% c
str3= Ilovegamecppcpp
8 w: u; h4 D& @9 p
; o/ Q2 k  {7 J, W/ K( o) a
. f% f/ u2 G; _

五、string查找和替换:

实现字符串的查找和替换函数原型:

  • int find(const string& str,int pos = 0)const;//查找str第一次出现位置从pos开始查找

  • int find(const char* s,int pos =0);//查找s第一次出现位置从pos开始查找

  • int find(const char* s,int pos,int n)const;//从pos位置查找s的前n个字符第一次位置

  • int find(const char c,int pos=0)const;//查找字符c第一次出现位置

  • int rfind(const string &str,int pos = npos)const;//查找str最后一次位置从pos开始查找

  • int rfind(const char*s,int pos=npos)const;//查找s最后一次出现位置从pos开始查找

  • int rfind(const char* s,int pos, int n)const;//从pos查找s的前n个字符最后一次位置

  • int rfind(const char c ,int pos = 0)const;//查找字符c最后一次出现位置

  • string& replace(int pos, int n,const string& str);//替换从pos开始n个字符为字符串str

  • string& replace(int pos, int n, const char* s);//替换从pos开始的n个字符为字符串s

      `2 P; {: i" v& o& L  R

代码应用:

#include <iostream>
1 i, Y3 T- v# p% l#include <string>
; G: D! w0 |$ F7 s0 r; Husing namespace std;
9 S+ p5 W% G8 _# ]* y0 W3 G( A% _8 w1 o" r5 Z; M+ E1 V
void test()
+ m9 l) J# t, }% A{$ J5 R8 ~: J& V  Z* {
  string str1 = "abcd";
0 l/ q2 M+ {/ Y; Z  int pos = str1.find("bc");
' }1 }  W8 _$ O) v  if(pos)
; }  Z) \) Y) P( Z  {
* k8 D, `; {2 z8 m! h% a, t& s2 ?     cout<< " find the word"<<endl;
- g; }$ ?4 p' S( Y  }+ n% |8 j+ p, b7 ^" s$ l
  else( Y+ W9 n2 o# s- q  |1 Y) d
  {
3 s2 `+ l( r7 [6 ^; I8 y    cout<<" not find the word"<<endl;, r4 z( Z7 p8 C0 m  P3 n
  }
. q* W' w3 L1 E/ ^5 L  cout<<"pos= "<<pos<<endl;
1 R& T$ N7 P* u5 P //rfind和find的区别:rfind从右往左查找,find从左往右查找2 O0 C- I; `0 m8 C+ r2 D
  pos = str1.rfind("cd");: v8 N! F* g' F6 W6 r) s0 n. Y
  cout<<"pos= "<<pos<<endl;0 A- U7 H! `  [7 U! n5 {
}+ Z3 A3 A1 x  y& ?$ X
void test1()& d# M: x9 C1 N
{( x4 R- p  [; O0 p
   string str2 = "abcd";
- ~0 [' t, g7 Y' @1 z" f   str2.replace(1,3,"1111");* u4 r# g3 e1 [+ a) I; N
   cout<<"str2= "<<str2<<endl;
1 D9 P& s/ U* C& [8 e( o7 Y% k3 h; e0 _' K
}
8 W* v% A& C+ v4 I4 {" f) d# L
' G2 [) f( x: Y  A/ ^int main()2 B7 _! Y& o+ N% g
{5 q& g4 V* h7 h3 H
  test();
+ A4 D$ t% Z4 y( ^7 K9 R* p  test1();9 c$ Y) M3 y( l) W; X
}
- j. v0 p6 i- H4 h& n* z; v( K4 \: \) b! B$ b& `! T  B! ]* |

结果输出:

root@txp-virtual-machine:/home/txp/test2# ./a.out
  r6 _+ z7 g1 i( B0 M3 }: F find the word
7 B. A. @4 @4 ^  B6 N. H: Ipos= 1
5 d2 P: E4 ]8 }( j6 K! vpos= 2
+ @! l. T. F# m7 [+ k' n$ xstr2= a1111
. P9 b2 H( o  R) d0 U; D% h5 i% t6 `# F- @. C" y1 z! ~

六、string字符串比较:

比较方式:字符串比较是按字符的ASCII码进行对比的:

= : 返回 0

>

: 返回 1

< : 返回 -1

函数原型:

  • int copare(const string &s)const;//与字符串s比较

  • int compare(const char *s)const;//与字符串s比较


    / q! \6 P, u9 F/ o

代码应用:

#include <iostream>
( T5 h* ?% o. I% G' E8 s5 ]#include <string>! }8 u6 k* v$ M3 o& ]3 i- g
using namespace std;
# J, [2 ]& ^  d5 k! }1 }7 C8 Z& C" [& [3 b) P' U9 h- v6 X
void test()
4 E+ ^& {7 V% G# G* |' a{
0 m6 h) g9 U( M6 \- x  string str1 = "txp";& ~7 I: n2 y: f) l3 Y% g. z4 B, B3 ?
  string str2 = "linux";  n& a/ V( C3 A
3 s. `7 A8 g' g: ^, r4 Y' O
  if(str1.compare(str2)==0)
: i/ X6 z; I: o! h  {' w  ]& `2 D" r- x8 ?' R( i
     cout<<"str1 = str2 "<<endl;: w) r- n! Z% o/ {* t* |$ y
  }" N& f# t. u0 p/ X* F/ W' m
  else if(str1.compare(str2)>0)
; m6 E/ T; o" H" ^& ]8 c5 b$ W! r  {
4 W  ~4 d# p+ c2 R4 q; S& d     cout<<"str1 > str2 "<<endl;: h8 Q2 i& `4 R" |+ B$ w$ X
  }" E8 Z; Z5 L8 k0 _
  else. C& h6 C; z. P1 V
  {
1 V8 ~5 ^4 R6 X* H: S     cout<<" str1 < str2 "<<endl;/ U) |; a" `. `
  }0 h! t/ c% N! T$ O
}
1 K3 V" Q& X0 i" ~! [. n. Y5 Y. s0 ^. M/ v

& v+ Q) c( ^: x, t3 I8 _& rint main()( f5 f# K( W7 D8 W
{
8 E, x* |2 Q% r9 ?4 \* w' D: R  test();4 t" K1 |7 O: E& R4 B2 `  D- k8 R6 n

3 {. U: L7 B, J}
& ~9 s2 M. A/ K6 }' J' R9 s5 G, T
5 x# ]$ V5 q4 I' d9 l

结果输出:

root@txp-virtual-machine:/home/txp/test2# ./a.out7 N( c6 |# O, Q! s0 T& a' G
str1 > str2
3 N" S7 U$ w6 q4 b1 i3 z  t9 u
$ \! h/ ]- s% l7 H" q

七、string字符存取:

实现字符存取函数原型:

  • char& operator[](int n);//通过[]方式取字符

  • char& at(int n);//通过at方法获取字符

    / |0 N+ N1 n# b2 _+ |

代码应用:

#include <iostream>& P& u& l1 _* ~( g
#include <string>0 q7 u: N& V: j% g; U6 Z
using namespace std;
. j- u5 U* E: `0 A( k
, N( t! \5 ~" V% Xvoid test()5 _2 {' O8 |  i& A4 M
{4 D$ q+ `, |! w' s4 g* E' x' B  K
  string str = "linux";
* V! g# n2 D1 ]  \3 G; }. n //通过[]访问单个字符
4 e- @, d" h7 B  Y# n1 h6 y  for(int i = 0;i< str.size();i++)
& {% K  V( i" L, ]5 z' O5 e' j- B! H  {, n8 V2 m% Y4 }2 X( q' U5 y
     cout<<str<<" ";
# d; H2 ]+ e& _7 D  }
" Z) D+ S# s) H4 N  cout<<endl;1 U% ^! K4 L- E. ~) F
//通过at方式访问单个字符
6 R$ `  D" a  H+ S' a  for(int i =0; i<str.size();i++)
" p; A' [) U( y7 b8 ?& ~; z7 T  {. w, r, E! f0 f, A) [* f
     cout<<str.at(i)<<" ";
9 \: g/ A6 ?0 M' A% F  }
9 L: k' `, H, S) J5 m3 w, ~  cout<<endl;0 O% _. h1 H% _! N% G: L
   //修改单个字符的方式
% @! T) R! g  u  [/ t  str[0] = 'x';/ q- b. X. {4 ]5 v
  cout<<"str = "<<str<<endl;
/ U  b2 L7 X& R, B- A
0 q- o* B' k8 b4 ~/ Q- C8 z  @, X2 i  str.at(1) = 'x';
: W, J- Z4 B9 S' {  @- m  cout<<"str = "<<str<<endl;
6 b+ \( V8 O- O. n' d1 @) Z7 Z" ]" T' x}( Q, w9 z* u: w$ o6 A; d
, [7 v9 U8 f9 u9 u# f  Q$ X

- B5 Q. u; Z1 w5 bint main()
. w2 y6 ]  m; g& L" z9 z7 W9 s" c{: J7 g: X$ N- C$ I* }
  test();
- e2 S  I/ E  n" ^0 l* U9 Y# z7 X/ c6 D# I. {
}4 d" H$ r8 @4 w7 c* J

) N" u/ e: F) [5 C5 K: b/ F

输出结果:

root@txp-virtual-machine:/home/txp/test2# ./a.out! _# }5 C" A: E) C" M2 t
l i n u x
' p( e8 t# z! U; B4 R' ~2 h5 Vl i n u x 1 Q6 F- j/ m' n; C
str = xinux) v& j, z( }* }! a* k
str = xxnux2 Y, T5 \/ K" W. g8 l6 J

2 }/ b. f2 z6 X$ R) ]( E# t# k$ o5 s

八、string插入和删除:

实现string插入和删除的函数原型:

  • string& insert(int pos,const char * s);//插入字符串

  • string& insert(int pos, const string&str);//插入字符串

  • string& insert(int pos, int n,char c);//在指定位置插入n个字符c

  • string& erase(int pos, int n = npos);//删除从pos开始的n个字符


    : T1 |" U8 u6 g

代码应用:

#include <iostream>
% M# S$ b$ X2 ^#include <string>
1 U4 H# W  m  k$ `6 nusing namespace std;
8 ^$ D' {. r+ n! R  L5 `& [
" n, a9 B4 v' `' z# c* s0 Bvoid test()' g' E, H  l+ f- f" ^/ ]7 t
{* e5 C+ A2 P( V( ]
  string str = "linux";
7 d, A% B3 c# O( b' m+ `9 {, Y$ f9 x9 d
  str.insert(1,"111");
9 d9 L# R* ^0 ~  ?8 }  cout<<"str = "<<str<<endl;9 L3 S+ y' x3 Y; Z
  W2 [4 W6 |. `) a
  str.erase(1,3);
: \: P0 }- g9 A" \8 o  g, N  cout<<"str = "<<str<<endl;
) H  p& X5 {4 |' R+ N% T6 o  V" N}
4 g$ o& h( l) w7 m8 E; y8 ]9 m2 H+ x" k1 S1 o& Z

: h7 G" I+ j! {, v9 g" }int main()9 G0 L& M- Z2 [  W% E
{
1 `% P5 I% u  e5 a2 `% r8 w  test();
0 W& k$ `0 B. e& U  H+ ~" X  / Z) O9 b+ I* z" k7 p
}
, m: o1 _9 l: U( s' e0 B
- E6 G* z3 Y9 G

结果输出:

root@txp-virtual-machine:/home/txp/test2# ./a.out
0 n" k; S! F  ~9 Vstr = l111inux
! f( G- e3 V% [5 ~# z, }9 t! ?str = linux4 O  V( d$ h* i" Y* W! ^
1 D( f8 p) X7 W4 k" s+ h$ v

九:string子串

实现从string字符串中获得子串的函数原型:

  • string substr(int pos =0 , int n =npos)const;//返回由pos开始的n个字符组成的字符串


    6 A' M* i* |% p. }0 T$ \

代码应用:

#include <iostream>0 g& {, F( G7 |. d5 i% Y' L2 q" i
#include <string>
( M  ^* M* k4 w- q9 k5 t0 nusing namespace std;; D# Z' p4 D) B( n1 Z+ [4 O1 s
7 `; T* Q& R" [" t( `  G
void test()
9 s' }) }4 k2 a# |{9 A# V! ~+ d% @
  string str = "linux";
* c2 ?9 K$ K& p- V1 G# b, b4 p- r- {9 p- S! w1 |
  string substr = str.substr(1,3);
1 W; x- p6 i" r. b  cout<<"substr =  "<<substr<<endl;
) b8 F) t# a9 T$ l
( x  `6 r% p0 b, o, j1 ~2 A  int pos = str.find('u');/ L+ k  p- l( w! N8 p5 ?
  string ur = str.substr(0,pos);( u' U6 O- _( M! m, ?7 R/ W% }0 _
  cout<<ur<<endl;
5 P8 }& [8 {* i2 i8 M}6 N& U1 Y, \6 K6 T4 x
! O8 e& \( m% |  i1 x/ e! E! N

! E, |' X. |- q* o/ e5 ?* g6 O! ~* R6 xint main()
- B- B' D6 B3 G3 G+ ~{
4 d4 {# Z+ `4 p  test();
3 k( A; u0 Q4 G; o: z+ h1 I  5 [, s5 Y- |- G1 Q
}
' E0 w& W1 N" r( q5 P. \! G; c5 ~  Y  U: C: g' x' m

结果输出:

root@txp-virtual-machine:/home/txp/test2# ./a.out
5 `# x3 i2 v: y/ Xsubstr =  inu7 e; R) ?8 ?  A& c% F  C
lin
$ r7 L  D0 Z+ m$ k& K
赞 收藏 评论0 发布时间:2020-10-6 21:33

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版