|
一、回顾c语言对字符串的实现: 一般我们在c语言要实现对字符串操作的话,一般是采用字符数组或者一组函数来实现的,为啥这样做呢,那是因为c语言里面根本就没有字符串类型的关键字;而且c语言也支持自定义类型,所以更加无法获得字符串类型 为了解决这个问题,在c++中,引入了自定义类型,而且可以通过类来完成对字符串类型的定义。那么C++中的原生类型系统是否包含字符串类型呢?答案是c++中并没有提供原生的字符串类型。 二、在C++标准库中提供了string类型:
代码示例: #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; ' n. Q( L5 ?3 ? void string_sort(string a[], int len), u' l( E3 G3 Z( P# V& ?/ l3 h { for(int i=0; i<len; i++) { for(int j=i; j<len; j++) { if( a > a[j] ) { 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 = ""; for(int i=0; i<len; i++): R% r- {) N( U { V( j( i. B# ?. `2 ^ ret += a + "; "; }; m8 Q6 p% J* Q return ret; } ' U3 t: y: p$ o5 E int main()5 ~9 G* J1 g2 H' t8 E { 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", "c++", "golang",6 M# Z5 \4 {$ R$ [( ~! v2 J "c"$ D3 k9 m9 I% u3 G };0 m( B; Y. G- E8 {' w; k string_sort(sa, 7); for(int i=0; i<7; i++)( @/ q" U6 U* z7 K6 o5 `( c { cout << sa << endl;1 \( W& q# p# f) } n } cout << endl; 2 F8 c/ y' O- W2 Z3 y5 ~9 m cout << string_add(sa, 7) << endl;. k! V: f6 q# A% z7 E return 0; }, a9 u ]! k! _- R 运行结果: root@txp-virtual-machine:/home/txp/tt# ./a.outc c++3 ?' n2 k0 ~/ X8 z* S: Z golang hello world. `; u& j1 H5 z: o; m- T linux& F k5 Z- \+ [8 h* w risc-v rust c;c++;golang;hello world;linux;risc-v;rust;0 Y5 z5 }6 V& v" ~3 v 三、字符串与数字的转换:
相关头文件
1、方法使用 string---数字 istringstream iss("123.45");- t! L+ M( r5 _# y6 \! J3 Y* C1 g0 t v- v& e# b double num; : b2 x* x2 R O/ S% l& Y7 C iss>>num * m3 S9 \8 G" w1 r) O3 m' N 注:传输成功,表达式值为 true,失败则为 false;- D1 {' R, I: J3 {* a 数字---string ostringsream oss;) _! 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(); 代码示例: #include <iostream>#include <sstream>% G- ?; n' }/ @; V! F #include <string> using 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) #define TO_STRING(n) (((ostringstream&)(ostringstream() << n)).str())9 ?0 ^! t6 e# V0 L( s int 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) ) { cout << n << endl; } 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# | } 2 C, Z$ e9 n! P7 I 输出结果: root@txp-virtual-machine:/home/txp/tt# ./a.out9 F8 ?& k* ?2 ^4 V234.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> using 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 u2 `, m; f6 n: { string ret = ""; unsigned int pos = 0;//找子串右移开始的位置; . c D2 c/ ~5 h n = n % s.length(); //防止右移位置很大的情况,让其合法' x- I8 f0 {, l# h' g( Z$ f pos = s.length() - n;//得到最终想要的位置; ret = s.substr(pos); //从 pos 开始直到末尾提取子串 t7 i. C' [! A7 | ret += s.substr(0, pos);//原来的字符串并没有被破坏,提取到 pos 之前的字符;3 v6 ]- O6 y4 m, e2 U return ret;! w: q$ Z) M# d7 l0 o; E. n h }! [( g9 h8 b% J! |; Q int main() { string s = "abcdefg"; string r = (s >> 3);) n3 f' \4 _, ^) D" [& }% u4 K cout << r << endl; return 0; } 输出结果: root@txp-virtual-machine:/home/txp/tt# ./a.out9 @2 o: Z4 U" ?# v+ F `. Fefgabcd! B6 [" e% O( \4 @ + d& j) K4 X. _0 R& a5 Q) | 3、小结:
好了,今天的分享就到这里,如果文章中有错误或者不理解的地方,可以交流互动,一起进步。 |
微信公众号
手机版