C++ 中的 `string` 类型:全面解析与高效操作

news2025/2/6 7:33:43

C++ 中的 string 类型:全面解析与高效操作

在 C++ 中,string 类型是对字符数组的高级封装,它提供了大量内置函数,使得字符串的处理变得更为简便和高效。与 C 风格的字符数组不同,string 类型不仅自动管理内存,还提供了更丰富的操作方法。本文将通过详细讲解 string 类型的概念、常见操作及相关函数,帮助你快速掌握这一强大工具。


1. string 类型的概念

在 C++ 中,string 类型属于标准库中的 std 命名空间。它实际上是一个类,封装了字符串操作的多个方法,使得我们无需手动管理字符数组的内存,避免了 C 语言中的常见问题(如字符串长度限制、手动添加结束符\0)。通过 string 类型,我们可以更方便、更安全地操作文本数据。

创建 string 对象

#include <iostream>
#include <string>
using namespace std;

int main() {
    string s1;         // 创建空字符串
    string s2 = "abc"; // 创建并初始化字符串

    cout << "s1: " << s1 << endl; // 输出空字符串
    cout << "s2: " << s2 << endl; // 输出 abc
    return 0;
}
  • string s1; 创建一个空字符串。
  • string s2 = "abc"; 通过字面量初始化字符串。

2. 常见的 string 操作

2.1 字符串的输入与输出

使用 cin 输入字符串
string s;
cin >> s; // 读取不带空格的字符串
cout << s << endl; // 输出输入的字符串
  • cin 读取时遇到空格会停止。
使用 getline 输入带空格的字符串

getline 是 C++ 标准库中的一个函数,用于从输入流中读取一行文本,并将其存储为字符串。与 cin 不同,getline 可以读取包括空格在内的整行字符串。

1. getline 的第一种形式

格式:

istream& getline(istream& is, string& str);
  • 这种形式的 getline 以换行符(\n)作为字符串的结束标志。
  • 它从输入流中读取文本,直到遇到换行符为止,然后将读取到的文本(不包括换行符)存储到指定的 string 类型变量 str 中。

示例代码:

#include<iostream>
#include<string>
using namespace std;

int main() {
    string name;
    getline(cin, name);  // 从键盘读取一行文本
    cout << name << endl;  // 输出读取的字符串
    return 0;
}

运行时,输入的字符串(包括空格)将被读取并存储在 name 变量中,然后输出。

2. getline 的第二种形式

格式:

istream& getline(istream& is, string& str, char delim);
  • 这种形式允许用户自定义结束标志(delim),即指定一个字符作为字符串的结束标志。
  • 它会从输入流中读取文本,直到遇到指定的字符为止,然后将读取到的文本(不包括该字符)存储到指定的 string 类型变量 str 中。

示例代码:

#include<iostream>
#include<string>
using namespace std;

int main() {
    string name;
    getline(cin, name, 'q');  // 从键盘读取一行文本,直到遇到字符 'q'
    cout << name << endl;  // 输出读取的字符串
    return 0;
}

在这个例子中,输入的文本会读取直到遇到字符 q 为止。q 字符不会被包含在最终的字符串中。

小提示:

在使用 C++ 中的 string 字符串时,如果字符串中需要包含空格,getline 函数是必须的。它在字符串输入时非常常见,尤其是在竞赛中处理字符串输入时,通常会使用 string 类型的字符串。


2.2 获取字符串长度

使用 size() 获取字符串的长度。

string s = "hello";
cout << "Length of string: " << s.size() << endl; // 输出 5
  • size() 返回字符串的字符数。

2.3 迭代器操作

C++ 中的 string 提供了迭代器,可以用于遍历字符串中的元素。(不过访问迭代器指向的值,需要解引⽤(*)。)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/1f32b64b16064647b8c954ebc39c7ee5.png

正序遍历
string s = "abcdef";
for (auto it = s.begin(); it != s.end(); ++it) {
    cout << *it << " "; // 输出字符
}

在这里插入图片描述

逆序遍历
string s = "abcdef";
for (auto it = s.end() - 1; it >= s.begin(); --it) {
    cout << *it << " "; // 输出字符
}

✅ ⼩提⽰:
• 迭代器是可以进⾏⼤⼩⽐较,也可以进⾏ + 或者 - 整数运算的。
⽐如: it++ ,就是让迭代器前进⼀步, it-- 就是让迭代器退后⼀步。
• 同⼀个容器的两个迭代器也可以相减,相减结果的绝对值,是两个迭代器中间元素的个
数。


2.4 添加字符:push_back()

push_back() 用于在字符串末尾添加一个字符。

string s = "hello";
cout << s << endl;  // 输出 hellow

在这里插入图片描述


2.5 字符串拼接:+=+ 运算符

C++ 中的 string 支持 +=+ 运算符,用于字符串拼接。

string s1 = "hello";
s1 += " world";  // 拼接字符串
cout << s1 << endl;  // 输出 hello world

string s2 = "hello";
cout << s2 + " world" << endl;  // 输出 hello world

在这里插入图片描述


2.6 删除字符:pop_back()

pop_back() 用于删除字符串末尾的一个字符。

string s = "hello";
s.pop_back();  // 删除 'o'
cout << s << endl;  // 输出 hell

在这里插入图片描述

  • 注意:当字符串为空时,再调用 pop_back() 会导致程序崩溃。

2.7 插入字符:insert()

insert() 方法允许你在字符串的指定位置插入字符或子串。

插入字符串
string s = "abcdefghi";
s.insert(3, "xxx");  // 在位置3插入字符串 "xxx"
cout << s << endl;  // 输出 abcdxxxefghi

在这里插入图片描述

插入多个相同字符
s.insert(3, 3, 'x');  // 在位置3插入3个字符 'x'
cout << s << endl;  // 输出 abcdxxxefghi

2.8 查找字符串:find()

find() 方法用于查找字符串中的子串或字符,并返回第一次出现的位置。若未找到,则返回 string::npos

查找子串
string s = "hello world hello everyone";
size_t pos = s.find("llo");
cout << "Found 'llo' at position: " << pos << endl;  //输出2

在这里插入图片描述

查找字符
string s = "hello world";
size_t pos = s.find('o');
cout << "Found 'o' at position: " << pos << endl;  // 输出 4
查找失败
string s = "hello world";
size_t pos = s.find("xyz");
if (pos != string::npos) {
    cout << "Found at position: " << pos;
} else {
    cout << "Not found" << endl;
}

2.9 截取子串:substr()

substr() 用于从字符串中截取子串,支持指定位置和长度。

截取指定位置后的子串
string s = "hello world";
string sub = s.substr(7);
cout << sub << endl;  // 输出 world

在这里插入图片描述

截取指定位置和长度的子串
string s = "hello world";
string sub = s.substr(7, 6);
cout << sub << endl;  // 输出 orld h

在这里插入图片描述


2.10 字符串关系运算符

C++ 提供了一些常用的字符串比较运算符,如 ==!=<> 等,比较是基于字典顺序进行的。

字符串相等比较
string s1 = "hello";
string s2 = "hello";
if (s1 == s2) {
    cout << "Equal" << endl;  // 输出 Equal
}
字符串大小比较
string s1 = "apple";
string s2 = "banana";
if (s1 < s2) {
    cout << "apple is less than banana" << endl;
}

2.11 字符串转数字:stoi()stol()stod()

这些函数将字符串转换为整数、长整型或浮点型。

string s = "123";
int num = stoi(s);
cout << num << endl;  // 输出 123

string s2 = "3.14";
double pi = stod(s2);
cout << pi << endl;  // 输出 3.14

2.12 将数字转换为字符串:to_string()

to_string() 将数字转换为字符串。

int num = 123;
string str = to_string(num);
cout << str << endl;  // 输出 123

3. 总结

C++ 的 string 类型为处理字符串提供了强大而高效的工具。通过使用诸如 insert()find()substr() 等函数,我们可以轻松地在字符串中进行插入、查找、截取等操作,避免了传统字符数组的复杂性。此外,运算符重载和转换函数使得字符串与其他数据类型之间的转换变得简便。掌握这些技巧,你将能够在实际开发中更高效地处理字符串相关问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2293667.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java入门进阶

文章目录 1、常用API 1.1、Math1.2、System1.3、Object1.4、Arrays1.5、基本类型包装类 1.5.1、基本类型包装类概述1.5.2、Integer1.5.3、int和String相互转换1.5.4、自动装箱和拆箱 1.6、日期类 1.6.1、Date类1.6.2、SimpleDateFormat类 1.6.2.1、格式化&#xff08;从Date到…

C#结合html2canvas生成切割图片并导出到PDF

目录 需求 开发运行环境 实现 生成HTML范例片断 HTML元素转BASE64 BASE64转图片 切割长图片 生成PDF文件 小结 需求 html2canvas 是一个 JavaScript 库&#xff0c;它可以把任意一个网页中的元素&#xff08;包括整个网页&#xff09;绘制到指定的 canvas 中&#xf…

485网关数据收发测试

目录 1.UDP SERVER数据收发测试 使用产品&#xff1a; || ZQWL-GW1600NM 产品||【智嵌物联】智能网关型串口服务器 1.UDP SERVER数据收发测试 A&#xff08;TX&#xff09;连接RX B&#xff08;RX&#xff09;连接TX 打开1个网络调试助手&#xff0c;模拟用户的UDP客户端设…

InnoDB和MyISAM的比较、水平切分和垂直切分、主从复制中涉及的三个线程、主从同步的延迟产生和解决

InnoDB和MyISAM的比较 事务支持&#xff1a; InnoDB支持&#xff1a;支持事务 (ACID 属性)。支持 Commit、Rollback 和 Savepoint 操作。适合需要事务处理的应用&#xff0c;例如银行系统。MyISAM:不支持事务。每次操作都是自动提交&#xff0c;不能回滚或中止。适合对事务要求…

JDK9新特性

文章目录 新特性&#xff1a;1.模块化系统使用模块化module-info.java&#xff1a;exports&#xff1a;opens&#xff1a;requires&#xff1a;provides&#xff1a;uses&#xff1a; 2.JShell启动Jshell执行计算定义变量定义方法定义类帮助命令查看定义的变量&#xff1a;/var…

基于Ubuntu2404搭建Zabbix7.2

Zabbix 搭建zabbix zabbix7.2已推出&#xff1a;官网 增加的新功能如下&#xff1a; 1.使用新的热门商品小部件全面概览指标 数据概览小部件已转换为热门项目小部件使用项目模式可以实现细粒度的项目选择利用条形图、指标和迷你图来可视化您的数据定义价值阈值以动态地可视化…

Math Reference Notes: 符号函数

1. 符号函数的定义 符号函数&#xff08;Sign Function&#xff09; sgn ( x ) \text{sgn}(x) sgn(x) 是一个将实数 ( x ) 映射为其 符号值&#xff08;即正数、负数或零&#xff09;的函数。 它的定义如下&#xff1a; sgn ( x ) { 1 如果 x > 0 0 如果 x 0 − 1 如…

【数据结构】链表应用-链表重新排序

重新排序 反转链表预期实现思路解题过程code力扣代码核心代码完整代码 总结 删除链表中间节点代码解惑 链表重新排序题目描述解题思路解题过程复杂度代码力扣代码完整代码 反转链表 预期实现 思路 你选用何种方法解题&#xff1f; 我选用了迭代法来反转链表。这是一种经典且高…

学习threejs,pvr格式图片文件贴图

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️PVR贴图1.2 ☘️THREE.Mesh…

2022年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题2)-网络部分解析-附详细代码

目录 附录1:拓扑图​编辑 附录2:地址规划表 1.SW1 2.SW2 3.SW3 4.SW4 5.SW5 6.SW6 7.SW7 8.R1 9.R2 10.R3 11.AC1 12.AC2 13.EG1 14.EG2 15.AP2 16.AP3 附录1:拓扑图 附录2:地址规划表

C++,STL,【目录篇】

文章目录 一、简介二、内容提纲第一部分&#xff1a;STL 概述第二部分&#xff1a;STL 容器第三部分&#xff1a;STL 迭代器第四部分&#xff1a;STL 算法第五部分&#xff1a;STL 函数对象第六部分&#xff1a;STL 高级主题第七部分&#xff1a;STL 实战应用 三、写作风格四、…

【AI论文】直接对齐算法之间的差异模糊不清

摘要&#xff1a;直接对齐算法&#xff08;DAAs&#xff09;通过在对齐人类反馈的强化学习&#xff08;RLHF&#xff09;中用直接策略优化替代强化学习&#xff08;RL&#xff09;和奖励建模&#xff08;RM&#xff09;&#xff0c;简化了语言模型对齐过程。DAAs可以根据其排序…

(9)gdb 笔记(2):查看断点 info b,删除断点 delete 3,回溯 bt,

&#xff08;11&#xff09; 查看断点 info b&#xff1a; # info b举例&#xff1a; &#xff08;12&#xff09;删除断点 delete 2 或者删除所有断点&#xff1a; # 1. 删除指定的断点 delete 3 # 2. 删除所有断点 delete 回车&#xff0c;之后输入 y 确认删除所有断点 举…

中间件的概念及基本使用

什么是中间件 中间件是ASP.NET Core的核心组件&#xff0c;MVC框架、响应缓存、身份验证、CORS、Swagger等都是内置中间件。 广义上来讲&#xff1a;Tomcat、WebLogic、Redis、IIS&#xff1b;狭义上来讲&#xff0c;ASP.NET Core中的中间件指ASP.NET Core中的一个组件。中间件…

S4 HANA手工记账Tax Payable – FB41

本文主要介绍在S4 HANA OP中手工记账Tax Payable – FB41。具体请参照如下内容&#xff1a; 手工记账Tax Payable – FB41 该事务代码用于手工处理税码统驭科目的记账&#xff0c;一般税码科目需要设置为只能自动记账&#xff0c;因此无法手工对税码统驭科目记账&#xff0c;但…

Java 大视界 -- Java 大数据在智慧文旅中的应用与体验优化(74)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

[leetcode]两数之和等于target

源代码 #include <iostream> #include <list> #include <iterator> // for std::prev using namespace std; int main() { int target 9; list<int> l{ 2, 3, 4, 6, 8 }; l.sort(); // 确保列表是排序的&#xff0c;因为双指针法要求输入是…

老游戏回顾:G2

一个老的RPG游戏。 剧情有独到之处。 ------- 遥远的过去&#xff0c;古拉纳斯将希望之光给予人们&#xff0c;人类令希望之光不断扩大&#xff0c;将繁荣握在手中。 但是&#xff0c;暗之恶魔巴鲁玛将光从人类身上夺走。古拉纳斯为了守护人类与其展开了一场激战&#xff0c…

行为驱动开发(BDD)如何提高自动化测试效率

在软件开发的过程中&#xff0c;自动化测试一直扮演着至关重要的角色。随着需求变化日益复杂、开发周期不断压缩&#xff0c;如何提升自动化测试的效率和准确性成为了现代软件开发团队的核心挑战之一。行为驱动开发&#xff08;BDD&#xff0c;Behavior Driven Development&…

Redis常见数据类型与编码方式

⭐️前言⭐️ 本小节围绕Redis中常见的数据类型与编码方式展开。 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f349;博主将持续更新学习记录收获&#xff0c;友友们有任何问题可以在评论区留言 &#x1f349;博客中涉及源码及博主日常练习代码均已上传GitHu…