6 C++ 标准库类型 string

news/2024/11/21 19:32:39/

  标准库类型string表示可变长的字符序列,使用string类型必须首先包含头文件#include <string>。作为标准库的一部分,string定义在命名空间std中。

1 定义和初始化string对象

  下表列出了初始化string对象的方式。

表 1:初始化string
语句描述
1string s1默认初始化,s1是一个空字符串。
2string s2(s1)s2s1的副本。
3string s2 = s1等价于s2(s1)s2s1的副本。
4string s3("value")s3是字面值"value"的副本,除了字面值最后的那个空字符外。
5string s3 = "value"等价于s3("value")s3是字面值"value"的副本。
6string s4(n, 'c')s4初始化为由连续n个字符c组成的串。

2 读写string对象

2.1 输入输出流

  输入输出流也可以读写string对象,例如:

string s;                       // 默认初始化空字符串
std::cin >> s;                  // 将 string 对象读入 s,遇到空白停止
std::cout << s << std::endl;    // 输出 s

在执行读取操作时,string对象会自动忽略开头的空白(即空格符、换行符、制表符等),并从第一个真正的字符开始读起,直到遇到下一处空白为止。因此,如果程序的输入是" Hello ",则输出将是"Hello",输出结果中没有任何空格。
  此外,也可以使用while语句实现读取未知数量的字符串对象,例如:

string word;
while (std::cin >> word) {                 // 反复读取,直至到达文件末尾std::cout << word << std::endl;        // 逐个输出单词,每个单词后面紧跟一个换行
}

2.2 使用getline()读取一整行

  有时我们希望能在最终得到的字符串中保留输入时的空白符,这时应该用getline()函数代替原来的>>运算符。getline()函数的参数是一个输入流和一个string对象,函数从给定的输入流中读入内容,直到遇到换行符为止(注意换行符也被读进来了),然后把所读的内容存入到那个string对象中去(注意不存在换行符)。getline()只要一遇到换行符就结束读取操作并返回结果,哪怕输入的一开始就是换行符。如果输入真的一开始就是换行符,那么所得的结果是个空string
  和输入运算符一样,getline()也会返回它的流参数。因此既然输入运算符能作为判断的条件,我们也能用getline()的结果作为条件。例如,我们要读取不定数量的行:

string line;
while (getline(std::cin, line)) {        // 每次读入一整行,直至到达文件末尾std::cout << line << std::endl;
}

因为line中不包含换行符,所以我们手动地加上换行操作符。

3 字符串的运算

3.1 索引

s[n]

  返回s中第n个字符的引用,位置n从 0 计起。

3.2 拼接

  两个string对象相加(+)得到一个新的string对象,其内容是把左侧的运算对象和右侧的运算对象串接而成。复合赋值运算符(+=)负责把右侧string对象的内容追加到左侧string对象的后面。例如:

string s1 = "Hello, ", s2 = "World";
string s3 = s1 + s2;                // s3 的内容是 "Hello World"
s1 += s2;                           // 等价于 s1 = s1 + s2

  即使一种类型并非所需,我们也可以使用它,前提是该种类型可以自动转换成所需的类型。因为标准库允许把字符字面值和字符串字面值转换成string对象,所以在需要string对象的地方就可以使用这两种字面值来替代。当把string对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符的两侧的运算对象至少有一个是string对象。例如:

string s4 = s1 + ", ";              // 正确:把一个 string 对象和一个字面值相加
string s5 = "Hello" + ", ";         // 错误:两个运算对象都不是 string
string s6 = s1 + ", " + "World";    // 正确:每个加法运算符都有一个运算对象是 string
string s7 = "Hello" + ", " + s2;    // 错误:不能把字面值直接相加

  警告:因为某些历史原因,也为了与 C 兼容,所以 C++ 中的字符串字面值并不是标准库类型string的对象。切记,字符串字面值与string是不同的类型。

3.3 比较

s1 == s2s1 != s2

  如果s1s2中所含的字符完全一样,则它们相等。

<<=>>=

  利用字符在字典中的顺序进行比较。

4 常用方法

4.1 长度

s.size()

  返回字符串s中字符的个数,即对象的长度。

s.empty()

  s为空返回true,否则返回false

4.2 子字符串操作

s.substr(pos, n)

  返回原始string对象的一部分或全部的拷贝。传递给substr()的是可选的开始位置和计数值。例如:

string s("Hello World");
string s2 = s.substr(0, 5);      // s2 = Hello
string s3 = s.substr(6);         // s3 = World
string s4 = s.substr(6, 11);     // s4 = World
string s5 = s.substr(12);        // 抛出一个 out_of_range 异常

如果开始位置超过了string的大小,则会抛出一个out_of_range异常。如果开始位置加上计数值大于string的大小,则会调整计数值,只拷贝到string的末尾。

4.3 处理string对象中的字符

  我们经常需要单独处理string对象中的字符。这类处理的一个关键问题是如何获取字符本身。另一个关键问题是要知道能改变某个字符的特性。在cctype头文件中定义了一组标准库函数来处理这部分工作,下表列出了主要的函数名及其含义。

表 2:cctype头文件中的函数。
语句描述
1isalpha(c)c是否为字母。
2isdigit(c)c是否为数字。
3isalnum(c)c是否为字母或数字。
4islower(c)c是否为小写字母。
5isupper(c)c是否为大写字母。
6isxdigit(c)c是否为十六进制数字。
7iscntrl(c)c是否为控制字符。
8isgraph(c)c是否为不是空格但可打印。
9isprint(c)c是否为可打印字符(即空格或具有可视形式)。
10ispunct(c)c是否为标点符号(即不是控制字符、数字、字母、可打印空白中的一种)。
11isspace(c)c是否为空白(即空格、横向制表符、纵向制表符、回车符、换行符、进纸符)。
12tolower(c)如果c是大写字母,输出对应的小写字母;否则原样输出c
13toupper(c)如果c是小写字母,输出对应的大写字母;否则原样输出c

4.3.1 处理每个字符

  如果想对string对象中的每个字符做点操作,目前最好的办法是使用范围for语句。一个string对象表示一个字符的序列,因此string对象可以作为范围for语句中的expression部分。

  如果想要改变string对象中字符的值,必须把循环变量定义成引用类型。使用引用作为循环控制变量时,这个变量实际上被依次绑定到了序列的每个元素上。使用这个引用,我们就能改变它绑定的字符。例如,假设我们想把一个字符串改写为大写字母的形式:

std::string s("Hello World!!!");
for (auto &c : s)c = toupper(c);    // c 是一个引用,因此赋值语句将改变 s 中字符的值

4.3.2 只处理一部分字符

  要想访问string对象中的单个字符有两种方式:一种是使用下标,另外一种是使用迭代器。

  下标运算符[]接收的输入参数是string::size_type类型的值,这个参数表示要访问的字符的位置;返回值是该位置上字符的引用。

  string对象的下标从 0 计起。下标的值称为“下标”或“索引”,任何表达式只要它的值是一个整型值就能作为索引。不过,如果某个索引是带符号类型的值,将自动转换成由string::size_type表达的无符号类型。如果使用下标访问空string将会引发不可预知的结果。

  只要字符串不是常量,就能为下标运算符返回的字符赋新值。


http://www.ppmy.cn/news/1548838.html

相关文章

前端之BFC:什么是BFC、开启了BFC能解决什么问题、如何开启BFC

1.什么是BFC 通俗点讲 2.开启了BFC能解决什么问题 3.如何开启BFC 即如下代码&#xff1a;

【PPTist】开源PPT编辑器初体验

前言&#xff1a;PPTist 是一款基于 Vue3.x TypeScript 构建的开源的PPT在线编辑器&#xff0c;功能很齐全&#xff0c;体验感很好&#xff0c;下载运行也很方便&#xff0c;没有奇奇怪怪的报错&#xff0c;分享给大家&#xff0c;以后可能会出系列&#xff01; 下载运行就不…

ubuntu 16.04 中 VS2019 跨平台开发环境配置

su 是 “switch user” 的缩写&#xff0c;表示从当前用户切换到另一个用户。 sudo 是 “superuser do” 的缩写&#xff0c;意为“以超级用户身份执行”。 apt 是 “Advanced Package Tool” 的缩写&#xff0c;Ubuntu中用于软件包管理的命令行工具。 1、为 root 用户设置密码…

项目进度计划表:详细的甘特图的制作步骤

甘特图&#xff08;Gantt chart&#xff09;&#xff0c;又称为横道图、条状图&#xff08;Bar chart&#xff09;&#xff0c;是一种用于管理时间和任务活动的工具。 甘特图由亨利劳伦斯甘特&#xff08;Henry Laurence Gantt&#xff09;发明&#xff0c;是一种通过条状图来…

spring-logback引用外部文件

背景 在spring微服务开发和云部署中&#xff0c;都涉及到日志的收集&#xff0c;很多时候为例方便管理和开发&#xff0c;很多公司都会开发一些基础配置代码。其中日志就是很重要的部分&#xff0c; 为了方便部署、收集、查看&#xff0c;所以日志文件需要存储在同一个…

汽车资讯新高度:Spring Boot技术飞跃

6系统测试 6.1概念和意义 测试的定义&#xff1a;程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为&#xff1a; 目的&#xff1a;发现程序的错误&#xff1b; 任务&#xff1a;通过在计算机上执行程序&#xff0c;暴露程序中潜在的错误。 另一个…

android 动画原理分析

一 android 动画分为app内的view动画和系统动画 基本原理都是监听Choreographer的doframe回调 二 app端的实现是主要通过AnimationUtils来实现具体属性的变化通过invilate来驱动 wms来进行更新。这个流程是在app进程完成 这里不是我分析的重点 直接来看下系统动画里面的本地动…

Linux进阶:压缩、解压

压缩、解压 Linux和Mac系统通常有2种压缩格式&#xff0c;后缀名分别是&#xff1a; .tar&#xff0c;称之为tarball&#xff0c;归档文件&#xff0c;即简单的将文件组装到一个.tar的文件内&#xff0c;并没有太多文件体积的减少&#xff0c;仅仅是简单的封装 .gz&#xff0…