当前位置: 首页 > news >正文

string 容器

std::string 是一个专门用于处理字符串的类,它比 C 风格字符串(字符数组)更安全、更易用、功能更强大。

1. 头文件与声明

首先需要包含 <string> 头文件。

#include <iostream>
#include <string> // 必须包含这个头文件using namespace std;int main() {// 声明 string 对象的不同方式string str1;               // 空字符串string str2 = "Hello";     // 用 C 风格字符串初始化string str3("World");      // 用构造函数初始化string str4(5, 'A');       // 包含 5 个 'A' 的字符串:"AAAAA"string str5 = str2;        // 拷贝初始化return 0;
}

2. 基本操作

字符串连接
string s1 = "Hello";
string s2 = "World";
string s3 = s1 + " " + s2;  // "Hello World"
s1 += " C++";               // s1 变为 "Hello C++"
访问字符
string str = "Hello";
cout << str[0];     // 输出 'H',使用下标操作符
cout << str.at(1);  // 输出 'e',使用 at() 方法(更安全,会检查边界)// 修改字符
str[0] = 'h';       // 字符串变为 "hello"
获取字符串信息
string str = "Hello World";
cout << "Length: " << str.length() << endl;    // 11
cout << "Size: " << str.size() << endl;        // 11 (与 length() 相同)
cout << "Is empty: " << str.empty() << endl;   // 0 (false)

3. 常用的成员函数(方法)

查找相关
string text = "Hello World, Welcome to C++";// find() - 查找子串位置
size_t pos = text.find("World");    // 返回 6
pos = text.find("Python");          // 返回 string::npos (未找到)// rfind() - 从后向前查找
pos = text.rfind("o");              // 返回 16// find_first_of() - 查找任何匹配字符的第一个位置
pos = text.find_first_of("aeiou");  // 返回 1 ('e')// find_last_of() - 查找任何匹配字符的最后一个位置
pos = text.find_last_of("aeiou");   // 返回 20 ('o')
子串操作
string str = "Hello World";// substr() - 获取子串
string sub1 = str.substr(6);        // "World" (从位置6开始到结尾)
string sub2 = str.substr(0, 5);     // "Hello" (从位置0开始,长度为5)// 实际应用:提取文件名和扩展名
string filename = "document.txt";
size_t dotPos = filename.find('.');
string name = filename.substr(0, dotPos);      // "document"
string extension = filename.substr(dotPos + 1); // "txt"
修改字符串
string str = "Hello";// append() - 追加字符串
str.append(" World");               // "Hello World"// insert() - 插入字符串
str.insert(5, " Beautiful");        // "Hello Beautiful World"// erase() - 删除部分字符串
str.erase(5, 10);                   // 从位置5开始删除10个字符 -> "Hello World"// replace() - 替换部分字符串
str.replace(6, 5, "C++");           // "Hello C++" (将"World"替换为"C++")// clear() - 清空字符串
str.clear();                        // 字符串变为空
比较字符串
string s1 = "apple";
string s2 = "banana";if (s1 == s2) {cout << "Strings are equal" << endl;
} else if (s1 < s2) {cout << s1 << " comes before " << s2 << endl; // 会输出这个
} else {cout << s1 << " comes after " << s2 << endl;
}// 也可以使用 compare() 方法
int result = s1.compare(s2);
if (result == 0) {cout << "Equal" << endl;
} else if (result < 0) {cout << "s1 < s2" << endl;
} else {cout << "s1 > s2" << endl;
}

4. 与 C 风格字符串的转换

// string 转 C 风格字符串
string cppStr = "Hello";
const char* cStr = cppStr.c_str();   // 获取只读的 C 风格字符串// C 风格字符串转 string
const char* cStyleStr = "World";
string fromCStr(cStyleStr);          // 直接构造

5. 输入输出

string name;// 从控制台输入
cout << "Enter your name: ";
getline(cin, name);  // 读取整行(包括空格)
// cin >> name;      // 只读取到第一个空格cout << "Hello, " << name << "!" << endl;

6. 综合示例

#include <iostream>
#include <string>
using namespace std;int main() {// 1. 创建和初始化string greeting = "Hello, Programming World!";cout << "Original: " << greeting << endl;// 2. 访问和修改cout << "First character: " << greeting[0] << endl;greeting[7] = 'p'; // Programming -> programmingcout << "After modification: " << greeting << endl;// 3. 查找操作size_t pos = greeting.find("World");if (pos != string::npos) {cout << "'World' found at position: " << pos << endl;}// 4. 提取子串string sub = greeting.substr(7, 11); // "programming"cout << "Substring: " << sub << endl;// 5. 替换操作greeting.replace(19, 5, "C++"); // 替换"World"为"C++"cout << "After replacement: " << greeting << endl;// 6. 字符串连接string ending = " Have a nice day!";string finalMessage = greeting + ending;cout << "Final message: " << finalMessage << endl;// 7. 大小和容量cout << "Length: " << finalMessage.length() << endl;cout << "Is empty? " << (finalMessage.empty() ? "Yes" : "No") << endl;return 0;
}

7. 实用技巧

// 遍历字符串的每个字符
string text = "Hello";
for (char c : text) {cout << c << " ";
}
// 输出: H e l l o// 使用迭代器遍历
for (auto it = text.begin(); it != text.end(); ++it) {cout << *it;
}// 转换为大写
for (char &c : text) { // 注意使用引用才能修改原字符串c = toupper(c);
}
cout << text; // 输出 "HELLO"// 检查字符串开头或结尾
string filename = "config.ini";
if (filename.ends_with(".ini")) {cout << "INI file detected" << endl;
}if (filename.starts_with("config")) {cout << "Config file" << endl;
}

string 的主要优势:

  1. 自动内存管理:不需要手动分配和释放内存

  2. 动态大小:可以根据需要自动调整大小

  3. 丰富的接口:提供了大量方便的操作方法

  4. 安全性:边界检查(使用 at() 时)

  5. 兼容性:可以轻松与 C 风格字符串互操作

std::string 是 C++ 中最常用和最实用的容器之一,几乎每个 C++ 程序都会用到它。

http://www.dtcms.com/a/394397.html

相关文章:

  • MySQL零基础学习Day1——安装与配置
  • mysql重启,服务器计划重启,如何优雅地停止MySQL?
  • 源码加密知识产权(二) JS压缩和加密——东方仙盟元婴期
  • ​​[硬件电路-308]:双通道通用比较器TC75W57FK 功能概述与管脚定义
  • 华为MindIE 推理引擎:架构解析
  • 使用 modelscope gpu 跑通第一个 cuda 入门实例
  • Agent实战02-agent入门案例LlamaIndex
  • 微服务基础1-微服务拆分与服务调用
  • http、UDP协议
  • 微服务基础3-服务保护与分布式事务
  • C++红黑树详解
  • 【不背八股】15.kmp算法/ Dijkstra算法/二叉树遍历
  • 【ES】ElasticSearch 数据库之查询操作 从入门>实践>精通 一篇文章包含ES的所有查询语法
  • huggingface-cli修改模型下载路径
  • 计算机视觉——灰度分布
  • OpenFeature 标准在 ABP vNext 的落地
  • Agentic AI 多智能体协作:开发实战、框架选型与踩坑指南
  • [优选算法专题三二分查找——NO.17二分查找]
  • 一文学会c++哈希
  • 【06】EPGF 架构搭建教程之 本地环境管理工具的本地化
  • 【开发实践】DNS 报文分析与 CDN 架构可视化方案
  • Ubuntu 系统下 Nginx + PHP 环境搭建教程
  • AI 如何改变日常生活
  • 字典树 Trie 介绍、实现、封装与模拟 C++STL 设计
  • 第一性原理(First Principles Thinking)
  • 1.UE-准备环境(一)-账号注册和打开虚幻引擎源码页面
  • javascript `AbortController`
  • 时间复杂度与空间复杂度
  • rocketmq队列和消费者关系
  • RAG评估指南:从核心指标到开源框架,打造高效检索生成系统