33 - C++中的字符串类
创始人
2024-02-13 16:23:04

---- 整理自狄泰软件唐佐林老师课程

1. 历史遗留问题

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

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

2. 标准库中的字符串类

C++语言直接支持C语言的所有概念
C++语言中 没有 原生的字符串类型

2.1 C++标准库中提供了 string类型

  • string直接支持字符串连接
  • string直接支持字符串的大小比较
  • string直接支持子串查找和提取
  • string直接支持字符串的插入和替换

2.2 编程实验:字符串类的使用

#include 
#include using namespace std;void string_sort(string a[], int len)
{for(int i=0; ifor(int j=i; jif( a[i] > a[j] ){swap(a[i], a[j]);}}}
}string string_add(string a[], int len)
{string ret = "";for(int i=0; iret += a[i] + "; ";}return ret;
}int main()
{string sa[7] = {"Hello World","D.T.Software","C#","Java","C++","Python","TypeScript"};string_sort(sa, 7);for(int i=0; i<7; i++){cout << sa[i] << endl;}cout << endl;cout << string_add(sa, 7) << endl;return 0;
}

在这里插入图片描述

2.3 字符串和数字的转换

  • 标准库中提供了相关的类对字符串和数字进行转换

  • 字符串流(sstream用于string的转换

    • 相关头文件
    • istringstream 字符串输入流
    • ostringstream 字符串输出流
  • 使用方法:

    • string ==> 数字
      在这里插入图片描述

    • 数字 ==> string
      在这里插入图片描述

2.4 编程实验:字符串和数字的转换

#include 
#include 
#include using namespace std;#define TO_NUMBER(s, n) (istringstream(s) >> n)
#define TO_STRING(n) (((ostringstream&)(ostringstream() << n)).str())int main()
{double n = 0;if( TO_NUMBER("234.567", n) ){cout << n << endl;    }string s = TO_STRING(12345);cout << s << endl;     return 0;
}

在这里插入图片描述

注:我们来分析一下上面两个宏定义:

#define TO_NUMBER(s, n) (istringstream(s) >> n)
#define TO_STRING(n) (((ostringstream&)(ostringstream() << n)).str())

他们的特别之处就在于:直接调用构造函数而产生了一个临时对象,临时对象的生命周期只有一条语句,利用临时对象把想要的变量输入或输出。(ostringstream() << n) 这条语句得出的结果类型返回basic_ostream类对象,它应该是ostringstream的父类,它可能没有str成员函数,所以要类型转换为子类对象,所以强制类型转换成 ostringstream& 。
在这里插入图片描述

2.5 编程实验:字符串循环右移

#include 
#include using namespace std;string operator >> (const string& s, unsigned int n)
{string ret = "";unsigned int pos = 0;n = n % s.length();pos = s.length() - n;ret = s.substr(pos);ret += s.substr(0, pos);return ret;
}int main()
{string s = "abcdefg";string r = (s >> 3);cout << r << endl;return 0;
}

在这里插入图片描述

3. 小结

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

相关内容

热门资讯

苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...