c++中字符串的用法_std::string常用成员函数与操作符详解

冬伟酱_7517

冬伟酱_7517

2026-03-19

400人浏览

原创

std::string不能直接用未初始化char[]赋值以防越界;substr需检查find返回值避免npos导致溢出;append与+=性能相近但reserve可优化拼接;判等优先用==而非compare()防逻辑错误。

c++中字符串的用法_std::string常用成员函数与操作符详解

std::string 构造和初始化为什么不能直接用 char[] 赋值?

因为 std::string 不接受 C 风格字符串字面量的隐式转换,更不支持 = 直接赋值给未声明类型的变量。常见错误是写成 std::string s = "hello"; 看似能过,但若写成 s = "world"; 在某些老编译器或严格模式下会触发隐式构造开销警告;更危险的是 char buf[10]; std::string s = buf; —— 这里 buf 未初始化,std::string 会一直读到随机内存里的 \0,导致越界或崩溃。

推荐做法:

  • 用双引号字面量初始化:std::string s = "hello";(调用 std::string(const char*) 构造函数)
  • 从已知长度的 char* 构造:std::string s(buf, len);,避免依赖结尾 \0
  • 需要兼容 C 接口时,用 s.c_str() 获取只读指针,别存它的地址作长期引用

substr() 和 find() 组合使用时索引越界怎么防?

substr() 第二个参数是长度,不是结束位置;find() 找不到返回 std::string::npos(通常是 -1 的无符号等价),这两者混用极易出错。比如 s.substr(pos, s.find(" ", pos) - pos),若空格不存在,find() 返回 npos,减法变成极大正数,substr() 抛 std::out_of_range。

安全写法:

  • 先检查 find() 结果:size_t pos = s.find(" "); if (pos != std::string::npos) { ... }
  • substr() 只传起始位置,省略长度参数让它自动截到末尾:s.substr(pos)
  • 取子串长度用 std::min() 限定:s.substr(pos, std::min(len, s.size() - pos))

operator+= 和 append() 性能差多少?

两者语义几乎一致,但 append() 是明确的“追加”意图,而 += 是运算符重载,部分旧标准库实现里 += 可能多一次临时对象构造。实际现代编译器(GCC 9+、Clang 10+、MSVC 2019+)基本都做了优化,汇编层面没区别。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

真正影响性能的是容量管理:

  • 反复 += 小字符串(如循环拼接)可能触发多次 realloc,建议提前 reserve()
  • append(const char*, size_t) 比 += std::string 少一次构造,适合已知长度的 C 字符串追加
  • 不要用 += 拼接单字符:s += 'c'; 没问题,但 s += "c"; 会构造临时 std::string,不如 push_back('c')

compare() 和 == 判等有什么隐藏差异?

== 是最常用也最安全的判等方式,它调用 compare() 内部逻辑并返回布尔值。而直接调用 compare() 返回的是整型:0 表示相等,负数表示左小,正数表示左大——这个设计是为了兼容 C 风格排序接口(如 qsort),但日常判等完全没必要绕这一圈。

容易踩的坑:

  • if (s.compare(t)) 意图是“不等”,但实际是“非零即真”,结果和 != 相反,逻辑翻车
  • compare() 支持子串比较:s.compare(pos1, n1, t, pos2, n2),但可读性差,易错,优先考虑 s.substr(...).compare(...) 或分步判断
  • 涉及大小写忽略比较时,== 不支持,必须手写或用 std::equal + std::tolower,别指望 compare() 自带

字符串比较这事,只要没特殊排序需求,就老实用 == 和 !=。复杂逻辑藏在 compare() 里的细节,多数时候只是增加出错概率。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

6359

3

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

2023.10.24

6064

49

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

2944

5

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

2025.10.17

1772

13

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2218

7

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1738

5

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

2684

5

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

2023.10.24

6064

49

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

2023.11.24

5669

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习