C++深度解析(23)—C++中的字符串

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_22847457/article/details/96563513

1.历史遗留问题

  • C语言不支持真正意义上的字符串 
  • C语言用字符数组一组函数实现字符串操作 
  • C语言不支持自定义类型,因此无法获得字符串类型 

2.解决方案

  • 从C到C++的进化过程引入了自定义类型,在C++中可以通过类完成字符串类型的定义 
  • 问题: C++中的原生类型系统是否包含字符串类型?

3.标准库中的字符串类

  • C++语言直接支持C语言的所有概念 
  • C++语言中没有原生的字符串类型 
  •  C++标准库提供了string类型 
    • string直接支持字符串连接
    • string直接支持字符串的大小比较
    • string直接支持子串查找和提取
    • string直接支持字符串的插入和替换

4.字符串类的使用

4.1 字符串的排序和添加


 
 
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. void string_sort(string a[], int len)
  5. { // 使用基本的冒泡排序来实现
  6. for ( int i = 0; i < len; i++)
  7. {
  8. for ( int j = i; j < len; j++)
  9. {
  10. if (a[i] > a[j])
  11. { // 对>进行了重载
  12. swap(a[i], a[j]);
  13. }
  14. }
  15. }
  16. }
  17. string string_add(string a[], int len)
  18. {
  19. string ret = "";
  20. for ( int i = 0; i < len; i++)
  21. {
  22. ret += a[i] + ";";
  23. }
  24. return ret;
  25. }
  26. int main()
  27. {
  28. string sa[ 7] =
  29. {
  30. "Hello World",
  31. "future",
  32. "C#",
  33. "Java",
  34. "C++",
  35. "Python",
  36. "TypeScript"
  37. };
  38. string_sort(sa, 7);
  39. for ( int i = 0; i < 7; i++)
  40. {
  41. cout << sa[i] << endl;
  42. }
  43. cout << endl;
  44. cout << string_add(sa, 7) << endl;
  45. system( "pause");
  46. return 0;
  47. }
  • 运行结果

4.2 字符串与数字的转换

  • 标准库中提供了相关的类对字符串和数字进行转换
  • 字符串流类(sstream)用于string的转换
    • <sstream> (相关头文件 ),
    • istringstream (字符串输入流 ),ostringstream (字符串输出流 )  
  • 使用方法:
  • string >> 数字

 
 
  1. istringstream iss("123.45");
  2. double num;
  3. iss >> num;
  • 数字 >> string

 
 
  1. ostringstream oss;
  2. oss << 543.21
  3. string s = oss.str();
  • iss >> num返回的是bool类型(在重载函数中,转换成功返回true),oss << 543.21返回的是对象oss

 
 
  1. #include <iostream>
  2. #include <sstream>
  3. #include <string>
  4. using namespace std;
  5. #define TO_NUMBER(s,n) (istringstream(s) >> n)
  6. #define TO_STRING(n) (((ostringstream &)(ostringstream() << n)).str())
  7. int main()
  8. {
  9. double n = 0;
  10. if (TO_NUMBER( "234.567", n))
  11. {
  12. cout << n << endl;
  13. }
  14. string s = TO_STRING( 12345);
  15. cout << s << endl;
  16. system( "pause");
  17. return 0;
  18. }
  • 运行结果:
  • 此处的宏定义比较巧妙,一般思路会使用多个函数进行不同数据类型的转换,但同样的函数体多次设置造成资源浪费。可以考虑使用后面学到的函数模版来进行实现,此处用宏定义的方法同样可以实现,更为简洁。
  • 可以用函数调用,实现如下:

 
 
  1. #include <iostream>
  2. #include <sstream>
  3. #include <string>
  4. using namespace std;
  5. bool to_number(string &s, double &dnum)
  6. {
  7. istringstream iss(s);
  8. return (iss >> dnum);
  9. }
  10. string to_string(string &s, double &dnum)
  11. {
  12. ostringstream oos;
  13. oos << dnum;
  14. return oos.str(); // ((ostringstream&)(ostringstream()?<<?n)).str()??
  15. }

​​​​​4.3 面试题分析——字符串循环右移

  • 字符串循环右移 
  • 示例: abcdefg循环右移3位后得到efgabcd 

 
 
  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. string operator>>( const string &s, unsigned int n)
  5. {
  6. string ret = "";
  7. unsigned int pos = 0;
  8. n = n % s.length(); // 移动n位相当于不移动
  9. pos = s.length() - n;
  10. ret = s.substr(pos); // 循环移位实质就是对子串进行搬移拼接
  11. ret += s.substr( 0, pos);
  12. return ret;
  13. }
  14. int main()
  15. {
  16. string s = "abcdefg";
  17. string r = (s >> 3);
  18. cout << "移位前: " << s << endl;
  19. cout << "移位后: " << r << endl;
  20. system( "pause");
  21. return 0;
  22. }
  • 运行结果:

5.小结

  • 应用开发中大多数的情况都在进行字符串处理 
  • C++中没有直接支持原生的字符串类型 
  • 标准库中通过string类支持字符串的概念 
  • string类支持字符串和数字的相互转换 
  • string类的应用使得问题的求解变得简单

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值