欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > 6 C++ 标准库类型 string

6 C++ 标准库类型 string

2025/4/19 14:32:08 来源:https://blog.csdn.net/zhaobenjian/article/details/143820519  浏览:    关键词:6 C++ 标准库类型 string

  标准库类型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将会引发不可预知的结果。

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词