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

C++——字符串类

[复制链接]
gaosmile 发布时间:2020-8-16 19:56
一、回顾c语言对字符串的实现:
一般我们在c语言要实现对字符串操作的话,一般是采用字符数组或者一组函数来实现的,为啥这样做呢,那是因为c语言里面根本就没有字符串类型的关键字;而且c语言也支持自定义类型,所以更加无法获得字符串类型
为了解决这个问题,在c++中,引入了自定义类型,而且可以通过类来完成对字符串类型的定义。那么C++中的原生类型系统是否包含字符串类型呢?答案是c++中并没有提供原生的字符串类型。
二、在C++标准库中提供了string类型:
  • string直接支持字符串连接
  • string直接支持字符串的大小比较
  • string直接支持字符串查找和提取
  • string直接支持字符串的插入和替换
    ( m- I6 U( L6 U0 a$ n
代码示例:
#include <iostream>4 Z, B6 K$ M: T8 E. @
#include <string>% }) o% |! L" q! X/ h# [6 v0 z0 ]
* T. W" H1 e$ O* n% U# a
using namespace std;
. M/ @  T# F0 j# {7 G4 A; ?' n. Q( L5 ?3 ?
void string_sort(string a[], int len), u' l( E3 G3 Z( P# V& ?/ l3 h
{
1 b* O2 t+ `. C5 x    for(int i=0; i<len; i++)
: k( A3 m* i7 D    {
2 G$ X6 |" D* ^& H. y. W        for(int j=i; j<len; j++)
5 r# J9 H  F9 X9 d' `        {
+ A, Y- k/ ]! p9 t) T" K            if( a > a[j] )
+ ]6 a" j) u& n4 \7 @            {
) x, X& u* q" l' k) {9 j, l                swap(a, a[j]);% _3 W. o$ H# e4 x6 t8 ~+ j+ x
            }0 G0 f9 M7 Z# A
        }) s& i3 o$ _* t$ Q
    }7 L2 |# d, Q) M3 `8 k
}) x. _" ~' z0 q2 w& O
" ?7 ?" E: v9 C1 E% B& P- E
string string_add(string a[], int len)0 Q) K  B$ \/ J; O% D7 I
{; N6 A, L, y4 K$ n( G* q* q8 K
    string ret = "";
( P9 K& R1 D3 r, G; ~   
9 F# V5 N0 P% \' s) i1 C& n    for(int i=0; i<len; i++): R% r- {) N( U
    {  V( j( i. B# ?. `2 ^
        ret += a + "; ";
2 v! ^( }3 S$ j, g! ?    }; m8 Q6 p% J* Q
   
- t: ^/ a! a1 g- G2 K' O( q3 R1 N6 R    return ret;
& i0 ^- L2 p9 b}
- f% W# g' n  ?; @% w1 p5 u9 }' U3 t: y: p$ o5 E
int main()5 ~9 G* J1 g2 H' t8 E
{
/ i6 r$ j* y' Q; k8 G5 v3 x    string sa[7] = % ?. m8 |7 M$ t8 r! j
    {. ?+ h6 Y8 s5 s
        "hello world",$ c+ W* w" h& o( ?  ^
      "linux",; d5 i+ C6 R' j3 s8 m
      "risc-v",& ~5 ]7 g3 R& z- i( u5 q- T
      "rust",
* z5 Z$ R! S3 k" E4 c& a4 H9 b      "c++",
* ~# `  g9 c: n0 \' m' d! U5 u      "golang",6 M# Z5 \4 {$ R$ [( ~! v2 J
      "c"$ D3 k9 m9 I% u3 G
    };0 m( B; Y. G- E8 {' w; k
   
  f+ ~6 C- k& s7 p+ z# \    string_sort(sa, 7);
2 s; E! a. O& M( W1 V0 B   
8 q5 [: g! S, B/ Y3 A: D9 g    for(int i=0; i<7; i++)( @/ q" U6 U* z7 K6 o5 `( c
    {
3 @4 W% w, k! h3 U+ Z) q) ~        cout << sa << endl;1 \( W& q# p# f) }  n
    }
8 G7 _& z% }  g1 X! R, A+ ]   
" K. Z- B* z; O" |% d2 A6 ~    cout << endl;
, h/ x: c9 P5 s, ?: D    2 F8 c/ y' O- W2 Z3 y5 ~9 m
    cout << string_add(sa, 7) << endl;. k! V: f6 q# A% z7 E
   
# \5 c% h, O- U" O# ~% f( B! v    return 0;
! m, R0 t4 |8 S' H6 K$ G& e}, a9 u  ]! k! _- R

+ v* S( x0 |5 Z5 I. M
运行结果:
root@txp-virtual-machine:/home/txp/tt# ./a.out
# S9 S$ n2 B, ac
1 P2 Q" \( Q, q! Cc++3 ?' n2 k0 ~/ X8 z* S: Z
golang
) E$ D+ R' ?6 M! ]3 D5 ?& vhello world. `; u& j1 H5 z: o; m- T
linux& F  k5 Z- \+ [8 h* w
risc-v
$ i/ |8 X; o2 J1 T0 y/ crust
; ?- |' a- p, E5 u
4 U  w5 k9 |3 r8 z2 {2 Yc;c++;golang;hello world;linux;risc-v;rust;0 Y5 z5 }6 V& v" ~3 v

4 j' c. N" v& j
三、字符串与数字的转换:
  • 标准库中提供了相关的类对字符串和数字进行转换
  • 字符串流类(sstream)用于string的转换
    * V1 ]$ c. K5 m0 b$ ^* e* m
相关头文件
  • istringstream字符串输入流
  • ostringstream字符串输出流
    : t4 I4 N$ w4 L8 }1 q  n5 S
1、方法使用
string---数字
istringstream iss("123.45");- t! L+ M( r5 _# y6 \! J
  3 Y* C1 g0 t  v- v& e# b
double num;
# H3 W3 L& x* d% Y& e  : b2 x* x2 R  O/ S% l& Y7 C
iss>>num
4 s7 S$ L: m8 J3 W# i9 `5 T  * m3 S9 \8 G" w1 r) O3 m' N
注:传输成功,表达式值为 true,失败则为 false;
- D1 {' R, I: J3 {* a
数字---string
ostringsream oss;
5 F+ I5 X: J' u: u) _! l' X* m, j! V
oss << 543.21;, t( T& t6 v6 B. S
  1 Y. A7 |4 V# C! w
string s = oss.str();

  v- z9 Y' P" T+ P4 U0 `
代码示例:
#include <iostream>
* j+ M4 }" H. _0 o) x- D#include <sstream>% G- ?; n' }/ @; V! F
#include <string>
) c% L; Y' p! j& m' w
" l# C; K9 U% n- Husing namespace std;+ ?! x4 N+ S7 J9 B) ^
6 z( [2 l2 |) f, x" s+ y) R
5 _7 [) q8 j) I0 O
#define TO_NUMBER(s, n) (istringstream(s) >> n)
& A$ W1 C$ b& C9 ~0 M! b3 z/ {8 Z#define TO_STRING(n) (((ostringstream&)(ostringstream() << n)).str())9 ?0 ^! t6 e# V0 L( s

% p/ H* p+ |1 t* R9 k( {4 oint main()' c% O- b1 s" z8 p
{6 N; m) K! ~9 Z- P
! k2 k4 ~& ?$ D7 l- w7 \( s" p  i
    double n = 0;: j: _/ e$ b8 h( L# ~3 k4 U9 g
   2 R1 {  b; }- @& m/ y+ g
    if( TO_NUMBER("234.567", n) )
1 @( N( H+ I9 ~: p! ?7 D! ^    {
' D4 S. K& f. B8 J3 [( a. J. Y' [        cout << n << endl;   
4 V3 z1 T- _# f' f; T    }
2 d% h9 J' O- Y/ b! b0 j
" Y7 G9 ^# j% J3 i    string s = TO_STRING(12345);$ {# {: X- Z9 \( m
3 y. r) J  u! d3 m& a4 C6 u2 k
    cout << s << endl;     " p# z% ^7 E# t) s# b7 _0 D
    % r# U/ a1 i' d; _
    return 0;% S( `. `" V# |
}
; y1 v1 _8 K) x& j+ [
2 C, Z$ e9 n! P7 I
输出结果:
root@txp-virtual-machine:/home/txp/tt# ./a.out9 F8 ?& k* ?2 ^4 V
234.5670 F+ M  u3 E2 d* L6 F: f, V
12345, U  ]; n3 l. p$ p
2 ~- Q. ?6 ]- F# l
2、字符串循环右移
比如说"abcdefg"循环右移3位后得到efgabcd
代码示例:
#include <iostream>' {' J& e* j% w7 o0 F6 E
#include <string>
: _- T) l- ~: r7 k4 L* R- E
! A# C. V5 \- ]/ X6 a( N+ r: C& `- Rusing namespace std;: i5 q$ X7 g( }. A; T1 m8 K+ {
( E+ I8 |3 l* S5 C* t
string operator >> (const string& s, unsigned int n)
3 A! Z! r4 S) F8 y# @% Y{  [3 u2 `, m; f6 n: {
    string ret = "";
. O/ @* q1 Q- [: t% m    unsigned int pos = 0;//找子串右移开始的位置;
6 m' u) b1 M5 R0 z  C1 R+ Y    . c  D2 c/ ~5 h
    n = n % s.length(); //防止右移位置很大的情况,让其合法' x- I8 f0 {, l# h' g( Z$ f
    pos = s.length() - n;//得到最终想要的位置;
/ j( d( ~# T. A% Z$ W* B; [    ret = s.substr(pos); //从 pos 开始直到末尾提取子串  t7 i. C' [! A7 |
    ret += s.substr(0, pos);//原来的字符串并没有被破坏,提取到 pos 之前的字符;3 v6 ]- O6 y4 m, e2 U
   
8 z; c4 k+ C4 c) ?* `$ N9 e    return ret;! w: q$ Z) M# d7 l0 o; E. n  h
}! [( g9 h8 b% J! |; Q

, a5 j2 t% B( tint main()
3 @5 [( C6 Y/ c: p) j{
% s4 l) g9 M" h    string s = "abcdefg";
1 A; t+ J0 G% S1 U2 y; N    string r = (s >> 3);) n3 f' \4 _, ^) D" [& }% u4 K
   
: `" \) E; X8 d$ L$ N7 N    cout << r << endl;
3 p$ Z( g% [! y' B   
9 T! T9 z+ R$ c2 G    return 0;
5 s, l2 i3 [3 N6 C}
: r$ s5 U$ P, G; n% c

7 H8 Y! @4 O% J6 U) m
输出结果:
root@txp-virtual-machine:/home/txp/tt# ./a.out9 @2 o: Z4 U" ?# v+ F  `. F
efgabcd! B6 [" e% O( \4 @
+ d& j) K4 X. _0 R& a5 Q) |
3、小结:
  • 应用开发中大多数的情况都在进行字符串处理
  • c++中没有直接支持原生的字符串类型
  • 标准库中通过string类支持字符串的概念
  • string类支持字符串和数字的互换转换
  • string类的应用使得问题的求解变得更加简单
    3 V$ K) f8 o: z# i; \
好了,今天的分享就到这里,如果文章中有错误或者不理解的地方,可以交流互动,一起进步。
赞 收藏 评论0 发布时间:2020-8-16 19:56

举报

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