跳转至

字符串的其他操作(先不看)

插入与删除子串

下面的片段需要 <string> 和 using namespace std;,分别运行。

插入子串

string s = "abc";
s.insert(1, "xxx"); // 在下标1之前插入,得到axxxbc

删除子串

string s = "abcdef";
s.erase(2, 3); // 从下标2开始,删除3个字符,得到abf
string s = "abcdef";
s.erase(3); // 从下标3开始,删到末尾,得到abc

C 风格字符串与 string

C 风格字符串以 '\0' 结尾。字符数组可以存它,也可以用字符指针指向它。

指针还没学过,这部分可以先跳过。

字符数组转 string

char s[] = "hello";
string str = s;
const char* p = "world";
string str = p;

也可以直接构造:

string str("hello");

string 提供 C 风格字符串,用 c_str()

string str = "hello";
const char* p = str.c_str();

p 指向 str 管理的内容,不是一个可以随便修改的新字符数组。

不要通过 p 修改字符。str 销毁后,p 不能再用;修改 str 后,需要重新取得指针。

string 与数字互相转换

需要头文件 <string>。

转成整数、小数

string s = "1234";
int x = stoi(s);
string s = "3.14159";
double x = stod(s);

下面先保证输入是合法数字,而且能放进目标类型。

stoi("12abc") 可以先转出开头的 12,不代表整个字符串都是合法整数。

完全不能转换,或数字超出范围时,会抛出异常,这里先不展开。

数字转成 string

int x = 123;
string s = to_string(x); // 得到"123"
double x = 3.14159;
string s = to_string(x);

小数转字符串后的格式,不要直接当成题目要求的保留位数。需要指定格式时,用前面讲过的格式化输出方法。

C 风格字符串转数字

使用 atoi、atof

需要头文件 <cstdlib>,这里也先保证输入是合法且范围合适的数字串。

char s[] = "123";
int x = atoi(s);
char s[] = "2.75";
double x = atof(s);

不能只看结果是不是 0,就判断转换成功。字符串 "0" 和不能转换的内容,都可能得到 0。

使用 sscanf

需要头文件 <cstdio>。

char s[] = "123";
int x;
int cnt = sscanf(s, "%d", &x); // 成功读入一个整数,cnt是1
char s[] = "2.75";
double x;
int cnt = sscanf(s, "%lf", &x);

成功读出一个数,也不代表整个字符串都符合数字格式,可能只读到了前面一部分。

字符数组的常用函数

需要头文件 <cstring>,下面参与操作的数组都要有足够容量。

比较内容,用 strcmp

char s1[] = "abc", s2[] = "abd";
int p = strcmp(s1, s2);

相等返回 0,前者按字典序较小返回负数,较大返回正数,不保证一定是 -1 或 1。

不能用 s1 == s2 比较两个字符数组的内容。

拼接,用 strcat

char s1[20] = "abc", s2[] = "def";
strcat(s1, s2); // s1变成abcdef

复制,用 strcpy

char s1[20], s2[] = "hello";
strcpy(s1, s2);

strcpy 复制到结束符为止,结束符也会复制。

memcpy 复制指定字节数

char s1[20], s2[] = "hello";
memcpy(s1, s2, strlen(s2) + 1); // 连同结束符一起复制

memcpy 不看结束符,只按给定字节数复制。上面的来源和目标是两个不同数组,不重叠。

长度与存储空间

string 的 size 与 sizeof,不是一回事。

s.size() 是当前包含的字符元素个数,sizeof(s) 是 string 对象本身的大小。

sizeof(s) 不是字符串长度,也不包括可能另行分配的字符存储空间,不能认定永远是 32 字节。

image-202509121606161 23

image-20250912160637175

image-20250912160755894

字符数组的结束符,不算长度,但占空间。

char s[] = "zq";
cout << strlen(s); // 长度2
cout << sizeof s;  // 数组占3字节

image-20250912154541600

image-20250912154629178