💡string类初始化

常用的初始化有赋值初始化与直接初始化
在C++种,还可以用列表初始化,但在string类初始化中并不常见

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <string>

using namespace std;

int main(){
string z;//初始化空字符串
string a ="Hello, world";//复制c风格字符串直到遇到'\0'
string b("Hello!");//调用构造函数复制c风格字符串
string b1=string("Hello!");//与上一种写法等价
string c(5,'z');
string d("HelloWorld", 5); // "Hello",取C风格字符串的前n个
string e(a,3,4);//从索引3开始截取4个字符
string f(a.begin()+1,a.end());//迭代器截取法开头取,结尾不取,左闭右开

cout<<a<<endl<<b<<endl<<c<<endl<<d<<endl<<e<<endl<<f<<endl;
return 0;
}

Hello, world
Hello!
zzzzz
Hello
lo,
ello, world

除此之外,还可以在声明string类后利用成员函数为其赋值或直接用赋值号赋值。

常用成员函数

常用的 std::string 成员函数包括:

  • 查找:find()
  • 追加:append()
  • 插入:insert()
  • 删除:erase()
  • 截取:substr()
  • 替换:replace()
  • 类型转换(与基本类型之间)

🔍 find()

查找子串首次出现的位置,找不到返回 string::npos

1
2
3
std::string s = "hello world";
size_t pos = s.find("world"); // 返回 6
size_t notFound = s.find("abc"); // 返回 string::npos

✂️ substr()

截取字符串的子串。

1
2
std::string s = "hello world";
std::string sub = s.substr(6, 5); // "world",从下标6开始,取5个字符

➕ append()

在字符串尾部追加内容。

1
2
std::string s = "hello";
s.append(" world"); // "hello world"

也可以使用操作符简写:

1
s += " world";

🧷 insert()

在指定位置插入字符串。

1
2
std::string s = "helloworld";
s.insert(5, " "); // "hello world"

🧹 erase()

删除指定位置的一段字符串。

1
2
std::string s = "hello world";
s.erase(5, 1); // 删除下标5开始的1个字符 → "helloworld"

🔁 replace()

替换指定位置的一段字符串为新字符串。

1
2
std::string s = "hello world";
s.replace(6, 5, "C++"); // "hello C++"

🔄 类型转换

string 转 int / double:

1
2
3
4
5
std::string s1 = "123";
int x = std::stoi(s1); // 123

std::string s2 = "3.14";
double y = std::stod(s2); // 3.14

int / double 转 string:

1
2
3
4
5
int a = 42;
std::string str1 = std::to_string(a); // "42"

double b = 3.14;
std::string str2 = std::to_string(b); // "3.140000"

🕑使用$ostringstream$类进行格式化输出

当我们拥有一些整数以及浮点数类型的数据,想将它们以某种格式储存至字符串内,应该如何做呢?
我们知道,在C语言中,这一操作依赖于函数$sprintf$和C语言的格式控制符,例如$\%4d$
而在C++中,这一操作依赖于$ostringstream$类和C++的格式控制符,例如setw()等。接下来我们简单介绍一下如何使用$ostringstream$类和C++的各类格式控制符。

$ostringstream$类的声明储存在头文件<$iomanip$>内,此头文件还储存其他C++的格式控制符。
那么,如何使用$ostringstream$类呢?
(需要注意的是,在此仅作最基础的使用解说。关于更加深入的用法,读者可以自行探索)

1
2
3
4
5
6
string getDays(int year,int month,int day){
ostringstream ans;
ans<<setw(4)<<setfill('0')<<year<<'-'
<<setw(2)<<setfill('0')<<month<<'-'
<<setw(2)<<setfill('0')<<day;
return ans.str();

如上,我们定义一个$ostringstream$类的对象,然后用输出流,将我们格式化好的内容输出至$ostringstream$类对象$ans$中即可。
假如我们需要调用其中的$string$类,我们可以使用str()方法。

格式控制符

格式控制符可以分为两类:

一次性生效(仅影响下一个值)

⭐$std::setw(n)$:设置字段宽度为 $n$,仅影响下一个输出的值。

⭐$std::setprecision(n)$:控制浮点数的小数位数
(通常用于 $std::fixed$ 或 $std::scientific$)。

持续生效(影响后续所有输出,直到显式更改)

对齐方式

$std::left$:左对齐(默认是右对齐)。
$std::right$:右对齐(默认行为)。

填充字符

$std::setfill(c)$:用字符 $c$ 填充空白位置(默认是空格)。

进制

$std::dec$:十进制(默认)。
$std::hex$:十六进制。
$std::oct$:八进制。

浮点数格式

$std::fixed$:使用固定小数点表示法(如 3.14),默认六位。
$std::scientific$:使用科学计数法(如 3.14e+00)。
$std::showpoint$:即使整数也显示小数点(如 3.0)。
$std::noshowpoint$:不强制显示小数点(默认)。

符号显示

$std::showpos$:在正数前显示 + 号(如 +42)。
$std::noshowpos$:不显示 + 号(默认)。

十六进制大小写字母

$std::uppercase$:十六进制输出 A-F,科学计数法 E 变大写。
$std::nouppercase$:恢复默认(小写 a-f,科学计数法 e)。

布尔值显示

$std::boolalpha$:true/false 方式输出布尔值。
$std::noboolalpha$:1/0 方式输出布尔值(默认)。

头文件

$std::setw(n)$,$std::setprecision(n)$,
$std::setfill(c)$这三个储存于<$iomanip$>
其余格式控制符储存于<$iostream$>