C++中string的使用

embedded/2024/10/19 7:30:22/

文章目录

  • string类对象的常见构造
  • string类对象的容量操作
    • size() / length():返回字符串的长度(字符数)。
    • capacity():返回当前字符串分配的容量(即在重新分配内存前可以保存的字符数)。
    • 检查是否为空:使用 empty() 函数检查字符串是否为空。
    • clear():清空字符串,使其变为空字符串。
    • reserve(size_t n):预留至少 n 个字符的空间,避免后续频繁分配内存。
    • resize(size_t n):调整字符串的大小。可以增大或缩小字符串的长度。
  • string类对象的访问及遍历操作
    • operator[]:使用索引访问或修改字符串中的某个字符(不进行边界检查)
    • 迭代器
  • string类对象的修改操作
    • push_back():在字符串末尾添加一个字符。
    • append():将指定的字符串或字符追加到当前字符串的末尾。
    • operator += 同append()类似,不过更加简洁
    • c_str()
    • find():查找子串在字符串中的位置,返回起始位置索引,若未找到返回string::npos。
    • rfind 返过来的find()
    • substr(Generate substring)
  • string类非成员函数
    • 1. operator>> —— 输入运算符
    • 2. operator<< —— 输出运算符
    • std::getline() 函数

前言:string 是 C++ 标准库中的一个类,专门用于处理和操作字符串。与 C 语言中的字符数组(char[])相比,string 提供了更丰富的功能和更安全的内存管理,极大地简化了字符串操作。

在string当中其含有许多的接口,我们通过这些接口去使用这些让我们写代码更加方便的函数,更加高效的完成我们想要实现的目标,所以我们需要了解部分的接口,让我们在进行结果的实现更加轻松,但是由于接口过多,所以我只需要知道关于string中重点,常用的即可

string类对象的常见构造

在这里插入图片描述

可以清楚的看到,在string构造当中含有许多的接口,这边我们重点了解的是

string()构造空的string类对象,即空字符串
string(const char* s)用C-string来构造string类对象
string(const string&s)拷贝构造函数
void Teststring(){string s1;                // 构造空的string类对象s1string s2("hello bit");   // 用C格式字符串构造string类对象s2string s3(s2);            // 拷贝构造s3}

string类对象的容量操作

size返回字符串有效长度
length返回字符串有效长度
capacity返回空间总大小
empty检测字符串释放为空串,是返回true,否则返回false
clear清空有效字符
reserve为字符串预留空间
resize将有效字符的个数该成n个,多出的空间用字符c填充

size() / length():返回字符串的长度(字符数)。

string str = "Hello";
cout << str.size();    // 输出 5
cout << str.length();  // 等同于 size()

capacity():返回当前字符串分配的容量(即在重新分配内存前可以保存的字符数)。

string str = "Hello";
cout << str.capacity();  // 输出当前分配的容量

检查是否为空:使用 empty() 函数检查字符串是否为空。

if (str.empty()) 
{cout << "String is empty" << endl;
}

clear():清空字符串,使其变为空字符串。

string str = "Hello";
str.clear();  // 结果为空字符串 ""

reserve(size_t n):预留至少 n 个字符的空间,避免后续频繁分配内存。

string str = "Hello";
str.reserve(100);  // 预留至少 100 个字符的空间

resize(size_t n):调整字符串的大小。可以增大或缩小字符串的长度。

string str = "Hello";
str.resize(10, 'x');  // 变为 "Helloxxxxx"

string类对象的访问及遍历操作

operator[]返回pos位置的字符,const string类对象调用
begin+endbegin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
rbegin+ rendbegin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
at()相比operator[]更加安全带边界检查

operator[]:使用索引访问或修改字符串中的某个字符(不进行边界检查)

string str = "Hello";
char c = str[1];   // 访问第二个字符,'e'
str[0] = 'h';      // 修改第一个字符

迭代器

string 提供了迭代器来遍历字符串:

begin() 和 end() 返回指向字符串起始和末尾的迭代器。
rbegin() 和 rend() 返回逆向迭代器,用于逆序遍历。

// 迭代器string::iterator it = s.begin();while (it != s.end()){cout << *it << endl;++it;}// string::reverse_iterator rit = s.rbegin();// C++11之后,直接使用auto定义迭代器,让编译器推到迭代器的类型auto rit = s.rbegin();while (rit != s.rend())cout << *rit << endl;// 3.范围forfor (auto ch : s)cout << ch << endl;
}

string类对象的修改操作

push_back在字符串后尾插字符
append在字符串后追加一个字符串
operator+=在字符串后追加字符串str
c_str返回C格式字符串
find + npos从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
rfind从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
substr在str中从pos位置开始,截取n个字符,然后将其返回

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

string str = "Hello";
str.push_back('!');
//输出: Hello!

append():将指定的字符串或字符追加到当前字符串的末尾。

//追加一个对象
string str1 = "Hello";
string str2 = " World";
str1.append(str2);  // 结果: "Hello World"
//追加多个副本
string str = "Hello";
str.append(3, '!');  // 结果: "Hello!!!"

operator += 同append()类似,不过更加简洁

string str1 = "Hello";
string str2 = " World";
str1 += str2;  // 结果: "Hello World"string str = "Hello";
str += '!';  // 结果: "Hello!"

c_str()

#include <iostream>
#include <string>
#include <cstdio>  // 用于 printfint main() {// 创建 std::string 对象std::string str = "Hello, C++";// 使用 c_str() 获取 C 风格字符串const char* cstr = str.c_str();// 打印 C 风格字符串std::printf("C-style string: %s\n", cstr);// 与 C 风格字符串进行交互(不能修改内容)if (std::strcmp(cstr, "Hello, C++") == 0) {std::cout << "Strings are equal!" << std::endl;}return 0;
}
输出:
C-style string: Hello, C++
Strings are equal!

find():查找子串在字符串中的位置,返回起始位置索引,若未找到返回string::npos。

string str = "Hello, World!";
size_t pos = str.find("World");  // 返回 7

rfind 返过来的find()

在这里插入图片描述
str:要查找的子字符串(可以是 std::string、const char* 或字符 char)。
pos:从字符串的右侧开始查找的起始位置,默认值是 npos,表示从字符串末尾开始查找。
n:要查找的字符数(当使用 const char* 时适用)。

int main ()
{string str ("The sixth sick sheik's sixth sheep's sick.");string key ("sixth");size_t found = str.rfind(key);if (found!=std::string::npos)str.replace (found,key.length(),"seventh");cout << str << '\n';return 0;
}输出:
The sixth sick sheik's seventh sheep's sick.

substr(Generate substring)

int main ()
{string str="We think in generalities, but we live in details."// (quoting Alfred N. Whitehead)string str2 = str.substr (3,5);     // "think"size_t pos = str.find("live");      // position of "live" in strstring str3 = str.substr (pos);     // get from "live" to the endcout << str2 << ' ' << str3 << '\n';return 0;
}输出:
think live in details.

string类非成员函数

operator+尽量少用,因为传值返回,导致深拷贝效率低
operator>>输入运算符重载
operator<<输出运算符重载
geline获取一行字符串
realtional operator大小比较

1. operator>> —— 输入运算符

operator>> 用于从输入流中提取数据。它将输入流中的数据读取到变量中,并根据变量的类型自动进行解析。

常见用法:
用 std::cin 从控制台输入数据。
可以用于基本数据类型(如 int、float、char 等)和字符串(std::string)的输入。

#include <iostream>
#include <string>int main() {int num;std::string name;// 输入整数std::cout << "Enter a number: ";std::cin >> num;// 输入字符串(单词)std::cout << "Enter your name: ";std::cin >> name;std::cout << "Number: " << num << ", Name: " << name << std::endl;return 0;
}
输出:
Enter a number: 42
Enter your name: John
Number: 42, Name: John

2. operator<< —— 输出运算符

operator<< 用于将数据输出到输出流中,通常与 std::cout 一起使用,用来将数据输出到控制台。它可以输出基本数据类型、字符串和用户自定义类型。

常见用法:
用 std::cout 将数据输出到控制台。
支持链式调用,可以连续输出多个数据。

#include <iostream>
#include <string>int main() {int age = 25;std::string name = "Alice";// 输出数据std::cout << "Name: " << name << ", Age: " << age << std::endl;return 0;
}
输出:
Name: Alice, Age: 25

std::getline() 函数

在 C++ 中,std::getline() 是一个用于从输入流中读取整行文本的函数。与 operator>> 不同,std::getline() 会读取包括空格在内的整行输入,直到遇到换行符 \n。它适用于需要获取用户输入的完整行内容的场景。
在这里插入图片描述
示例 1:读取一行文本

#include <iostream>
#include <string>int main() {std::string input;std::cout << "Enter a line of text: ";// 读取整行输入,直到遇到换行符std::getline(std::cin, input);std::cout << "You entered: " << input << std::endl;return 0;
}
Enter a line of text: Hello, World!
You entered: Hello, World!

示例 2:自定义分隔符

#include <iostream>
#include <string>int main() {std::string input;std::cout << "Enter text (semicolon ';' to end): ";// 读取输入,直到遇到分号std::getline(std::cin, input, ';');std::cout << "You entered: " << input << std::endl;return 0;
}
Enter text (semicolon ';' to end): This is a test; Some more text
You entered: This is a test

std::string 是 C++ 标准库中的字符串类,它提供了对字符串操作的丰富接口和功能,极大地简化了对文本数据的处理。std::string 是面向对象的,并且支持动态内存管理,这使得它比 C 风格的字符数组(char[])更加灵活和安全。


http://www.ppmy.cn/embedded/120034.html

相关文章

基本控制结构2

顺序结构 程序按照语句的书写次序顺序执行。 选择结构 判断选择结构又称条件分支结构&#xff0c;是一种基本的程序结构类型。 在程序设计中&#xff0c;当需要进行选择、判断和处理的时候&#xff0c;就要用到条件分支结构。 条件分支结构的语句一般包括if语句、if–else…

git clone或repo init 时报错:fatal: 协议错误:错误的行长度 xxx

执行repo init或git clone时报错:protocol error: bad line length 或协议错误:错误的行长度 系统版本:Ubuntu20.04 repo version v2.47 repo launcher version 2.45 git version 2.25.1 报错信息 fatal: 协议错误:错误的行长度 948 fatal: 远端意外挂断了 repo: err…

从0学习React(4)---更新组件状态setState

在上篇文章中&#xff0c;我们讲了React中的一些基础&#xff0c;包括组件的种类以及state的使用。上篇文章的结尾&#xff0c;我们讲到了如何更新组件的状态&#xff08;使用setState&#xff09;。但是我没有讲的很详细&#xff0c;这篇文章我们详细的讲一下React中如何更新组…

Qt Linguist手册-翻译员

翻译人员 Qt Linguist 是为 Qt 应用程序添加翻译的工具。一旦安装了 Qt&#xff0c;就可以像开发主机上的其他应用程序一样启动 Qt Linguist。 Qt Linguist 主窗口包含一个菜单栏和以下视图&#xff1a; 上下文 (F6) 用于从上下文列表中选择要翻译的字符串。字符串 (F7) 用于…

选择租用徐州服务器机柜的作用有哪些?

企业为了线上网络业务&#xff0c;通常都会选择租用服务器来确保网络的稳定性&#xff0c;企业选择服务器租用和托管业务后&#xff0c;同时也需要租用服务器机柜来进行放置所使用的服务器&#xff0c;对于机柜企业可以选择租用徐州机柜&#xff0c;下面就来聊一下选择租用徐州…

IvorySQL 3.4 来了

9 月 26 日&#xff0c;IvorySQL 3.4 发版。本文将带大家快速了解新版本特性。 IvorySQL 3.4 发版说明 IvorySQL 3.4 基于 PostgreSQL 16.4&#xff0c;修复了多个问题&#xff0c;并增强多项功能。 PostgreSQL 16.4 的变更 在未经授权时防止 pg_dump 执行&#xff0c;并引入一…

本篇4K,立志最细,FreeRtos中Queue使用教程与个人理解!!!

前言&#xff1a;编写不易&#xff0c;请勿搬运&#xff0c;仅供学习参考&#xff01;&#xff01;&#xff01; 目录 FreeRtos中Queue的使用 Queue创建 Queue实际调用 动态创建和静态区别 Queue接受数据 Queue实际调用 Queue发送数据 Queue实际调用 Queue队列集使用…

爬虫库是什么?是ip吗

爬虫库通常指的是用于网页爬虫&#xff08;Web Scraping&#xff09;开发的代码库或框架&#xff0c;它不是IP地址。以下是关于爬虫库的详细解释&#xff1a; 爬虫库的定义 爬虫库是一些用于简化网络数据抓取过程的工具和框架&#xff0c;通常提供了一系列函数和类&#xff0…