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

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() 等函数,我们可以轻松地在字符串中进行插入、查找、截取等操作,避免了传统字符数组的复杂性。此外,运算符重载和转换函数使得字符串与其他数据类型之间的转换变得简便。掌握这些技巧,你将能够在实际开发中更高效地处理字符串相关问题。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

穷举vs暴搜vs深搜vs回溯vs剪枝系列一>黄金矿工

目录 决策树&#xff1a;代码设计代码&#xff1a; 决策树&#xff1a; 代码设计 代码&#xff1a; class Solution {boolean[][] vis;int ret,m,n;public int getMaximumGold(int[][] grid) {m grid.length;n grid[0].length;vis new boolean[m][n]; for(int i 0; i <…

DeepSeek 的含金量还在上升

大家好啊&#xff0c;我是董董灿。 最近 DeepSeek 越来越火了。 网上有很多针对 DeepSeek 的推理测评&#xff0c;除此之外&#xff0c;也有很多人从技术的角度来探讨 DeepSeek 带给行业的影响。 比如今天就看到了一篇文章&#xff0c;探讨 DeepSeek 在使用 GPU 进行模型训练…

使用SpringBoot发送邮件|解决了部署时连接超时的bug|网易163|2025

使用SpringBoot发送邮件 文章目录 使用SpringBoot发送邮件1. 获取网易邮箱服务的授权码2. 初始化项目maven部分web部分 3. 发送邮件填写配置EmailSendService [已解决]部署时连接超时附&#xff1a;Docker脚本Dockerfile创建镜像启动容器 1. 获取网易邮箱服务的授权码 温馨提示…

两种文件类型(pdf/图片)打印A4半张纸方法

环境:windows10、Adobe Reader XI v11.0.23 Pdf: 1.把内容由横排变为纵排&#xff1a; 2.点击打印按钮&#xff1a; 3.选择打印页范围和多页&#xff1a; 4.内容打印在纸张上部 图片&#xff1a; 1.右键图片点击打印&#xff1a; 2.选择打印类型&#xff1a; 3.打印配置&am…

C语言打印输出星号图形(三角形、菱形、漏斗)

文章目录 1. 介绍2. 案例分析3. 漏斗型4. 直角三角形4.1 左上直角三角形4.2 右上直角三角形4.3 左下直角三角形4.4 右下直角三角形 5. 等腰三角形5.1 正等腰三角形5.2 倒等腰三角形 6. 平行四边形6.1 纵向左下平行四边形6.2 纵向左上平行四边形6.3 横向左上平行四边形6.4 横向左…

刷题记录 动态规划-7: 63. 不同路径 II

题目&#xff1a;63. 不同路径 II 难度&#xff1a;中等 给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角&#xff08;即 grid[0][0]&#xff09;。机器人尝试移动到 右下角&#xff08;即 grid[m - 1][n - 1]&#xff09;。机器人每次只能向下或者向右移动一步。…

springboot+vue+uniapp的校园二手交易小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

Python 自学秘籍:开启编程之旅,人生苦短,我用python。

从2009年&#xff0c;用了几次python后就放弃了&#xff0c;一直用的php&#xff0c;现在人工智能时代&#xff0c;完全没php什么事情。必须搞python了&#xff0c;虽然已经40多岁了。死磕python了。让滔滔陪着你一起学python 吧。 开启新世界 在当今人工智能化的时代&#xff…

react的antd表格自定义图标

将原版的加号换成箭头 自定义图标 安装图标包&#xff1a; npm install --save ant-design/icons 引入&#xff1a; import { RightOutlined, DownOutlined } from ant-design/icons; 参数是一个函数 <Table columns{columns} dataSource{data} indentSize{20}expandIc…

chrome浏览器chromedriver下载

chromedriver 下载地址 https://googlechromelabs.github.io/chrome-for-testing/ 上面的链接有和当前发布的chrome浏览器版本相近的chromedriver 实际使用感受 chrome浏览器会自动更新&#xff0c;可以去下载最新的chromedriver使用&#xff0c;自动化中使用新的chromedr…

Vim的基础命令

移动光标 H(左) J(上) K(下) L(右) $ 表示移动到光标所在行的行尾&#xff0c; ^ 表示移动到光标所在行的行首的第一个非空白字符。 0 表示移动到光标所在行的行首。 W 光标向前跳转一个单词 w光标向前跳转一个单词 B光标向后跳转一个单词 b光标向后跳转一个单词 G 移动光标到…

算法与数据结构(括号匹配问题)

思路 从题干可以看出&#xff0c;只要给出的括号对应关系正确&#xff0c;那么就可以返回true,否则返回false。这个题可以使用栈来解决 解题过程 首先从第一个字符开始遍历&#xff0c;如果是括号的左边&#xff08;‘&#xff08;‘&#xff0c;’[‘&#xff0c;’}‘&…

deepseek、qwen等多种模型本地化部署

想要在本地部署deepseek、qwen等模型其实很简单,快跟着小编一起部署吧 1 环境搭建 1.1下载安装环境 首先我们需要搭建一个环境ollama,下载地址如下 :Ollama 点击Download 根据自己电脑的系统选择对应版本下载即可 1.2 安装环境(window为例) 可以直接点击安装包进行安…

(2025,LLM,下一 token 预测,扩散微调,L2D,推理增强,可扩展计算)从大语言模型到扩散微调

Large Language Models to Diffusion Finetuning 目录 1. 概述 2. 研究背景 3. 方法 3.1 用于 LM 微调的高斯扩散 3.2 架构 4. 主要实验结果 5. 结论 1. 概述 本文提出了一种新的微调方法——LM to Diffusion (L2D)&#xff0c;旨在赋予预训练的大语言模型&#xff08;…

一款wordpress AI免费插件自动内容生成+前端AI交互+文章批量采集

一款wordpressAI自动内容生成前端AI会话窗口交互文章批量采集免费插件 1. SEO优化文章生成 关键词驱动的内容生成&#xff1a;用户可以输入关键词或长尾关键词&#xff0c;插件会根据这些关键词生成高质量的SEO优化文章。文章结构清晰&#xff0c;语言自然流畅&#xff0c;符合…

2024年12月 Scratch 图形化(一级)真题解析 中国电子学会全国青少年软件编程等级考试

202412 Scratch 图形化&#xff08;一级&#xff09;真题解析 中国电子学会全国青少年软件编程等级考试 一、单选题(共25题&#xff0c;共50分) 第 1 题 点击下列哪个按钮&#xff0c;可以将红框处的程序放大&#xff1f;&#xff08; &#xff09; A. B. C. D. 标…

Java面试题集合篇5:10道基础面试题——保姆级详细图文、代码解释

文章目录 前言41、多线程场景下使用 ArrayList42、List 和 Set 区别43、HashSet 实现原理44、HashSet检查重复和保证数据不可重复45、BlockingQueue46、Map接口46.1、HashMap 实现原理46.2、HashMap在JDK1.7和JDK1.8中不同点46.3、JDK1.7 VS JDK1.8 比较 47、HashMap的put方法流…

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:地址规划表

优化数据库结构

MySQL学习大纲 一个好的数据库设计方案对于数据库的性能尝尝会起到事倍功半的效果&#xff0c;合理的数据库结构不仅使数据库占用更小的磁盘空间&#xff0c;而且使查询速度更快。数据库结构的设计需要考虑数据冗余、查询和更新速度、字段的数据类型是否合理等多方面的内容&…

【deepseek实战】绿色好用,不断网

前言 最佳deepseek火热网络&#xff0c;我也开发一款windows的电脑端&#xff0c;接入了deepseek&#xff0c;基本是复刻了网页端&#xff0c;还加入一些特色功能。 助力国内AI&#xff0c;发出自己的热量 说一下开发过程和内容的使用吧。 目录 一、介绍 二、具体工作 1.1、引…