C++ string 对象的操作(三十五)

news2025/4/8 1:20:33

1. string 对象的常见操作

下面的表格列出了 string 类型最常用的一些操作以及它们的功能:

操作说明示例
os << s将字符串对象 s 写入输出流 os,返回 os。std::cout << s;
is >> s从输入流 is 中读取字符串赋给 s(以空白分隔),返回 is。std::cin >> s;
getline(is, s)从输入流 is 中读取一整行存入 s(读取到换行符为止,但不存储换行符),返回 is。std::getline(std::cin, s);
s.empty()如果字符串为空返回 true,否则返回 false。if (s.empty()) { ... }
s.size()返回字符串中字符的个数(即长度)。auto len = s.size();
s[n]返回 s 中第 n 个字符的引用(下标从 0 开始)。char ch = s[0];
s1 + s2返回 s1 和 s2 连接后的新字符串对象。string s3 = s1 + s2;
s1 = s2将 s2 的副本赋给 s1,覆盖 s1 原有内容。s1 = s2;
s1 == s2, s1 != s2判断两个字符串是否相等(比较时对大小写敏感)。if (s1 == s2) { ... }
<, <=, >, >=根据字典顺序比较两个字符串(同样区分大小写)。if (s1 < s2) { ... }

说明:
对于 string 对象,输入操作符 (>>) 读取时会自动忽略开头的空白字符,并在遇到空白时结束读取,而 getline 则会读取一整行(遇到换行符就结束,并且不保存换行符)。

2. 读写 string 对象

与 int、double 等内置类型一样,我们可以使用 iostream 操作符对 string 对象进行读写操作。

2.1 使用 >> 和 <<

例如,下面的代码演示了如何读取一个单词并输出:

#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;

int main() {
    string s; // 默认初始化为空字符串
    cin >> s; // 读取单词,遇到空白字符停止
    cout << s << endl; // 输出读取到的字符串
    return 0;
}

假设输入为 " Hello World! ",则 >> 操作符只会读取到 “Hello”,输出结果为:

Hello

如果需要连续读取多个单词,可以这样写:

#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;

int main() {
    string s1, s2;
    cin >> s1 >> s2;  // 分别读取两个单词
    cout << s1 << s2 << endl;  // 输出 "HelloWorld!" (没有空格)
    return 0;
}

2.2 使用 getline 读取整行

有时我们希望能读取包含空白字符的整行内容,这时应使用 getline 函数。getline 函数的原型通常为:

std::getline(is, s);

下面是一个示例程序,它逐行读取输入并输出每一行:

#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;

int main() {
    string line;
    // 每次读取一整行,直到遇到文件结束标记
    while (std::getline(cin, line)) {
        cout << line << endl; // 输出整行(注意 line 中不包含换行符)
    }
    return 0;
}

如果输入为:

Hello World!
This is a test.

程序会输出:

Hello World!
This is a test.

2.3 判断空和求长度

  • empty()
    string 对象的 empty() 成员函数返回一个布尔值,若字符串为空则返回 true。可以用来判断字符串是否为空。

  • size()
    size() 返回字符串中字符的个数,其返回类型为 string::size_type,这通常是一个无符号类型,足以存放任何 string 对象的大小。建议使用 auto 或 decltype 推断变量类型:

string s = "Hello";
if (!s.empty()) {
    auto len = s.size(); // len 的类型为 string::size_type
    cout << "Length: " << len << endl;
}

注意: 在表达式中混用带符号与无符号数时要小心,可能会导致意想不到的结果。例如,如果将负数与 size() 的返回值进行比较,负数会被转换为很大的无符号数。

3. 字符串的赋值、连接与比较

3.1 赋值操作

string 类型支持赋值操作,可以用一个 string 对象的副本替换另一个对象的内容:

string st1("hello");
string st2("world");
st1 = st2;  // st1 现在的内容与 st2 相同,即 "world"

3.2 字符串连接

可以使用加号运算符 (+) 将两个 string 对象连接生成一个新的 string 对象:

string s1 = "hello,";
string s2 = "world!";
string s3 = s1 + s2;  // s3 的内容为 "hello,world!"

复合赋值运算符 (+=) 则用于将右侧 string 的内容追加到左侧对象的后面:

s1 += s2; // 等价于 s1 = s1 + s2;  s1 变为 "hello,world!"

3.3 与字面值的连接

由于 C++ 允许将字符字面值和字符串字面值转换为 string 对象,因此在需要 string 对象的地方可以直接使用字面值。但必须注意运算符 + 的两侧至少有一个操作数是 string 类型,否则就会出现编译错误:

string s1 = "hello";
string s4 = s1 + ",";           // 正确:s1 是 string,对 "," 进行转换后相加
// string s5 = "hello" + ",";   // 错误:两个字面值相加没有 string 对象参与

// 正确写法:确保每个加法运算符至少有一个操作数是 string
string s6 = s1 + ("," + string("world"));

一种常见的写法是:

string s6 = (s1 + ",") + "world";

这样子表达式的左侧一定是 string 类型,从而避免字面值之间直接相加的问题。

3.4 字符串比较

string 类型支持关系运算符:

  • 相等性比较==!= 用于判断两个 string 对象是否包含完全相同的字符序列(对大小写敏感)。
  • 关系比较<<=>>= 根据字典顺序逐字符比较两个字符串的大小。
    例如:
    string str = "Hello";
    string phrase = "Hello World";
    string slang = "Hiya";
    // 根据规则,"Hello" < "Hello World"(较短且前缀相同),而 "Hiya" 大于 "Hello" 及 "Hello World"
    

4. 总结

  • 读写 string 对象:

    • 使用 >> 操作符可读取单词(以空白分隔),使用 getline 读取整行。
    • 输出时使用 << 操作符。
  • 判断与获取长度:

    • empty() 判断是否为空。
    • size() 返回字符串长度,其类型为 string::size_type,建议使用 auto 推导。
  • 赋值和连接:

    • 赋值运算符 (=) 用于复制字符串内容。
    • 加法运算符 (+) 用于字符串连接,注意混合字面值时至少有一侧是 string 对象。
    • 复合赋值运算符 (+=) 用于追加字符串。
  • 比较操作:

    • 字符串比较运算符基于字典顺序且区分大小写。

理解和熟练使用这些操作不仅能提高你在字符串处理方面的编程效率,同时也能帮助你写出更健壮、更具可读性的 C++ 代码。

参考资料

  • cppreference.com 关于 std::string 的详细文档
  • 各大 C++ 编码规范(如 Google C++ Style Guide)中对字符串操作的建议

通过对标准库 string 对象各项操作的全面解析,希望你能对 C++ 中字符串的使用有一个清晰而深入的理解,并能在实际项目中灵活应用这些操作。

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

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

相关文章

DAPP实战篇:规划下我们的开发线路

前言 在DApp实战篇&#xff1a;先用前端起个项目一文中我们起了一个前端项目&#xff0c;在后续开发中笔者将带领大家一步步完成这个DAPP&#xff0c;为了方便后续讲解&#xff0c;本篇将完整说明后续我们要进行的开发和思路。 主打前端 实际上一个完整的DAPP是由前端和智能…

【Elasticsearch】开启大数据分析的探索与预处理之旅

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

状态机思想编程练习

状态机实现LED流水灯 本次实验&#xff0c;我们将利用状态机的思想来进行Verilog编程实现一个LED流水灯&#xff0c;并通过Modelsim来进行模拟仿真&#xff0c;再到DE2-115开发板上进行验证。 ​ 首先进行主要代码的编写。 module led (input sys_clk,input sys_…

前端新增数据,但数据库里没有新增的数据

先看情况&#xff1a; 1.前端&#xff0c;可以进行删查改&#xff0c;但是新增数据之后&#xff0c;显示保存成功&#xff0c;也增加了空白的一行&#xff0c;但是数据没有显示出来。 2.后端接收到了数据&#xff0c;但返回结果的列表里面是空的&#xff1b;同时数据库里面没…

httpx模块的使用

在使用requests模块发起请求时&#xff0c;报以下错误&#xff0c;表示服务器有可能使用的是http2.0协议版本&#xff0c;导致requests无法爬取。 此时就可以使用httpx模块爬取。 先下载httpx模块&#xff1a; pip install httpx[http2]然后用httpx发起请求&#xff1a; impo…

论文阅读10——解开碳排放与碳足迹之间的关系:文献回顾和可持续交通框架

原文地址: Unraveling the relation between carbon emission and carbon footprint: A literature review and framework for sustainable transportation | npj Sustainable Mobility and TransportTransportation decarbonization has drawn enormous attention globally,…

新一代AI架构实践:数字大脑AI+智能调度MCP+领域执行APP的黄金金字塔体系

新一代AI架构实践&#xff1a;数字大脑智能调度领域执行的黄金金字塔体系 一、架构本质的三层穿透性认知 1.1 核心范式转变&#xff08;CPS理论升级&#xff09; 传统算法架构&#xff1a;数据驱动 → 特征工程 → 模型训练 → 业务应用 新一代AI架构&#xff1a;物理规律建…

Winform MQTT客户端连接方式

项目中使用到Winform的数据转发服务&#xff0c;所以记录下使用到的方法。 一.创建单例模板 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApp.Scripts {public class SingleTon&…

Linux Bash 脚本实战:自动监控域名证书过期并发送邮件告警

在日常运维工作中,SSL 证书的管理是一个非常重要的环节,尤其对于线上业务来说,证书到期会直接导致服务不可用。为了避免证书到期带来的风险,我们可以编写一个 Bash 脚本来自动检测域名的 SSL 证书过期时间,并在证书即将到期时发送告警邮件。 目录 脚本功能概述 代码实现…

【模型量化】GPTQ 与 AutoGPTQ

GPTQ是一种用于类GPT线性最小二乘法的量化方法&#xff0c;它使用基于近似二阶信息的一次加权量化。 本文中也展示了如何使用量化模型以及如何量化自己的模型AutoGPTQ。 AutoGPTQ&#xff1a;一个易于使用的LLM量化包&#xff0c;带有用户友好的API&#xff0c;基于GPTQ算法(仅…

学透Spring Boot — 018. 优雅支持多种响应格式

这是我的专栏《学透Spring Boot》的第18篇文章&#xff0c;想要更系统的学习Spring Boot&#xff0c;请访问我的专栏&#xff1a;学透 Spring Boot_postnull咖啡的博客-CSDN博客。 目录 返回不同格式的响应 Spring Boot的内容协商 控制器不用任何修改 启动内容协商配置 访…

C++中的多态和模板

#include <iostream> #include <cstdlib> #include <ctime> #include <string>using namespace std;// 武器基类 class Weapon { public:virtual ~Weapon() {}virtual string getName() const 0; // 获取武器名称virtual int getAtk() const 0; …

Wireshark 安装保姆教程(图文详解)

一、Wireshark 简介 Wireshark是使用最广泛的一款开源抓包软件&#xff0c;常用来检测网络问题、攻击溯源、或者分析底层通信机制。它使用WinPCAP作为接口&#xff0c;直接与网卡进行数据报文交换&#xff0c;它支持在 Windows、Mac OS、Linux 等多种主流操作系统上运行 &…

下载安装Node.js及其他环境

提示&#xff1a;从Node版本降级到Vue项目运行 文章目录 下载Node.js环境配置配置环境变量 安装 cnpm&#xff08;我需要安装&#xff09;安装脚手架安装依赖安装淘宝镜像&#xff08;注意会更新&#xff09;cnpm vs npm 与新旧版本核心差异包管理器不同功能差异如何选择&#…

MyBatis Plus 在 ZKmall开源商城持久层的优化实践

ZKmall开源商城作为基于 Spring Cloud 的高性能电商平台&#xff0c;其持久层通过 MyBatis Plus 实现了多项深度优化&#xff0c;涵盖分库分表、缓存策略、分页性能、多租户隔离等核心场景。以下是具体实践总结&#xff1a; 一、分库分表与插件集成优化 1. 分库分表策略 ​Sh…

rust 同时处理多个异步任务,并在一个任务完成退出

use std::thread; use tokio::{sync::mpsc,time::{sleep, Duration}, };async fn check_for_one() {// 该函数会每秒打印一次 "write"loop {println!("write");sleep(Duration::from_secs(1)).await;} }async fn start_print_task() -> Result<(), (…

使用注解开发springMVC

引言 在学习过第一个springMVC项目建造过后&#xff0c;让我们直接进入真实开发中所必需的注解开发&#xff0c; 是何等的简洁高效&#xff01;&#xff01; 注&#xff1a;由于Maven可能存在资源过滤的问题&#xff0c;在maven依赖中加入 <build><resources>&l…

【Axure元件分享】时间范围选择器

时间范围选择器下拉选择开始时间和结束时间&#xff0c;实现效果如下。 源文件截图&#xff1a; 元件获取方式&#xff1a;

【Linux操作系统——学习笔记三】Linux环境下多级目录构建与管理的命令行实践报告

1.在用户主目录下&#xff0c;使用以下方法新建目录&#xff0c;并显示详细执行过程&#xff1a; &#xff08;1&#xff09;使用绝对路径在当前目录下创建 new_dir目录 &#xff08;2&#xff09;使用相对路径、在当前目录创建dir1、dir2、dir3目录 &#xff08;3&#xff09…

C# 与 相机连接

一、通过组件连接相机 需要提前在VisionPro里面保存一个CogAcqFifoTool相机工具为 .vpp 定义一个相机工具 CogAcqFifoTool mAcq null;将保存的相机工具放入mAcq中 string path “C:\Acq.vpp”; mAcq (CogAcqFifoTool)CogSerializer.LoadObjectFrommFile(path);给窗口相机…