字符串的其他操作(先不看)¶
插入与删除子串¶
下面的片段需要 <string> 和 using namespace std;,分别运行。
插入子串
删除子串
C 风格字符串与 string¶
C 风格字符串以 '\0' 结尾。字符数组可以存它,也可以用字符指针指向它。
指针还没学过,这部分可以先跳过。
字符数组转 string
也可以直接构造:
string 提供 C 风格字符串,用 c_str()
p 指向 str 管理的内容,不是一个可以随便修改的新字符数组。
不要通过 p 修改字符。str 销毁后,p 不能再用;修改 str 后,需要重新取得指针。
string 与数字互相转换¶
需要头文件 <string>。
转成整数、小数
下面先保证输入是合法数字,而且能放进目标类型。
stoi("12abc") 可以先转出开头的 12,不代表整个字符串都是合法整数。
完全不能转换,或数字超出范围时,会抛出异常,这里先不展开。
数字转成 string
小数转字符串后的格式,不要直接当成题目要求的保留位数。需要指定格式时,用前面讲过的格式化输出方法。
C 风格字符串转数字¶
使用 atoi、atof
需要头文件 <cstdlib>,这里也先保证输入是合法且范围合适的数字串。
不能只看结果是不是 0,就判断转换成功。字符串 "0" 和不能转换的内容,都可能得到 0。
使用 sscanf
需要头文件 <cstdio>。
成功读出一个数,也不代表整个字符串都符合数字格式,可能只读到了前面一部分。
字符数组的常用函数¶
需要头文件 <cstring>,下面参与操作的数组都要有足够容量。
比较内容,用 strcmp
相等返回 0,前者按字典序较小返回负数,较大返回正数,不保证一定是 -1 或 1。
不能用 s1 == s2 比较两个字符数组的内容。
拼接,用 strcat
复制,用 strcpy
strcpy 复制到结束符为止,结束符也会复制。
memcpy 复制指定字节数
memcpy 不看结束符,只按给定字节数复制。上面的来源和目标是两个不同数组,不重叠。
长度与存储空间¶
string 的 size 与 sizeof,不是一回事。
s.size() 是当前包含的字符元素个数,sizeof(s) 是 string 对象本身的大小。
sizeof(s) 不是字符串长度,也不包括可能另行分配的字符存储空间,不能认定永远是 32 字节。



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

