news 2026/4/18 10:51:41

【C / C++】带你系统的认识 string

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【C / C++】带你系统的认识 string

【C / C++】带你系统的认识 string
从零到精通,一次性把 string 搞明白!(2026 年最新视角,涵盖 C 和 C++ 所有常见用法)

C 和 C++ 里,string 有三种完全不同的“身份”,很多人混着用才踩坑。我们按难度和使用场景来系统拆解:

1. C 语言里的“string” —— 其实就是 char 数组 + ‘\0’

C 语言没有内置 string 类型,所有字符串都是以\0 结尾的 char 数组

写法示例含义常见坑点
char s[10] = “hello”;自动加 ‘\0’,占用 6 字节别忘了留位置给 ‘\0’!
char s[] = “hello”;自动推导大小(6 字节)最安全写法
char *p = “hello”;字符串常量,存放在只读区,不可修改p[0] = ‘H’; → 段错误!
char buf[100]; scanf(“%s”, buf);读取输入到 buf超长输入 → 缓冲区溢出(经典安全漏洞)

C 语言常用字符串函数(都在 <string.h> 里):

函数作用返回值安全注意
strlen(s)求长度(不含 ‘\0’)size_t-
strcpy(dest, src)复制(包括 ‘\0’)dest容易溢出,慎用!
strncpy(dest, src, n)复制最多 n 个字符dest可能不加 ‘\0’,要手动补
strcat(dest, src)追加dest容易溢出
strcmp(s1, s2)比较(字典序)0 / 正 / 负-
strstr(hay, needle)查找子串找到位置 / NULL-

C 语言安全写法推荐(现代 C):

charbuf[100];fgets(buf,sizeof(buf),stdin);// 安全读一行buf[strcspn(buf,"\n")]='\0';// 去掉换行符

2. C++ 里的 std::string —— 真正现代字符串(推荐 99% 场景)

C++ 引入了<string>头文件里的std::string,它才是我们平时说的“string”。

核心特点

  • 自动管理内存(无需手动 new/delete)
  • 动态长度(可以随意 append、resize)
  • 支持 +、+=、[] 等运算符
  • 线程安全(C++11 后标准保证)
  • 性能极高(小字符串优化 SSO)

常用操作速查表

操作方式代码示例说明
声明string s = “hello”;
string s(10, ‘a’);
10 个 ‘a’
拼接s += " world";
s = s + “!” ;
支持 + 和 +=
取长度s.length() / s.size()两者等价
访问字符s[0], s.at(0)at() 会抛异常,[] 不抛
追加s.append(“abc”);
s.push_back(‘d’);
插入s.insert(5, “XXX”);在下标 5 插入
替换s.replace(2, 3, “new”);从 2 开始替换 3 个字符
查找s.find(“world”);
s.rfind(“o”);
返回位置,找不到返回 string::npos
截取子串s.substr(0, 5);前 5 个字符
清空s.clear();
s = “”;
判空s.empty()
比较s == “hello”
s > “abc”
支持所有比较运算符

小技巧合集(面试/实战必备):

string s="hello, world!";s.erase(5,2);// 删除 ", " → "helloworld!"s.erase(s.find("world"));// 删除 "world" 及之后所有

格式化字符串(C++20 及以上最优雅):

#include<format>string msg=std::format("Hello {}, your score is {}",name,score);

C++17 结构化绑定 + string_view(性能神器):

string_view sv="hello";// 只读视图,不拷贝

3. C 和 C++ 混用时的“转换坑”(最容易踩雷)

场景正确写法错误写法(会导致崩溃/未定义行为)
const char* → stringstring s = cstr;string s = (char*)cstr;
string → const char*const char* p = s.c_str();const char* p = s.data(); (C++17 前危险)
string → char 数组strcpy(buf, s.c_str());strcpy(buf, s.data());
从 scanf 读到 stringstring s; scanf(“%s”, &s[0]); // C++11 后可行scanf(“%s”, s); // 错!
printf 打印 stringprintf(“%s”, s.c_str());printf(“%s”, s); // 错!

最佳实践(2026 年写 C++ 项目):

  • 能用std::string就别用 char 数组
  • 需要和 C 接口交互时,用s.c_str()传出去
  • 需要可修改的 char 缓冲区,用s.data()(C++17 后保证可写)
  • 永远不要忘记:string内部可能有小字符串优化(SSO),data()不一定指向堆内存

4. 面试/大厂常考 string 题目(带解析)

  1. 实现strcpystrcatstrcmp
  2. 字符串反转(in-place)
  3. 去掉字符串中所有空格
  4. 判断回文串(忽略大小写和非字母)
  5. 实现atoi(字符串转整数)
  6. 实现 KMP 算法找子串
  7. 用 string 实现大整数加法

总结一句话口诀

C 里 string = char[] + ‘\0’
C++ 里 string = std::string(自动管理、动态、安全、高效)

你现在用 string 最多遇到哪类问题?
是拼接性能、内存泄漏、C/C++ 混用转换、还是面试算法题?
把具体场景告诉我,我可以给你更针对性的代码模板和避坑指南!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 13:58:21

多模态RAG不是“加个图”那么简单:从解析到生成的全流程拆解

前言 各位码农兄弟姐妹们&#xff0c;今天咱们不聊框架选型&#xff0c;也不卷大模型参数&#xff0c;来唠点实在的——多模态RAG。你可能已经用纯文本RAG搞定了客服问答、知识库检索&#xff0c;甚至写了个小助手能自动回答公司制度问题。但某天产品经理突然甩来一张产品架构…

作者头像 李华
网站建设 2026/4/17 22:28:20

大数据深度学习|计算机毕设项目|计算机毕设答辩|基于Django的京东智能家电销量数据分析系统设计与实现

一、项目介绍 随着人们生活水平的提高和智能家电市场的快速发展&#xff0c;智能家电用品的销售情况分析与可视化显得尤为重要。本文针对智能家电用品市场&#xff0c;基于Python技术&#xff0c;对销售数据进行挖掘与分析&#xff0c;并以可视化形式展示分析结果&#xff0c;旨…

作者头像 李华
网站建设 2026/4/16 19:45:24

大数据深度学习|计算机毕设项目|计算机毕设答辩|基于大数据专业岗位招聘信息的人才需求特征分析 系统设计与实现

一、项目介绍 基于大数据专业岗位招聘信息的人才需求特征分析系统&#xff0c;以提升用户体验和招聘效率为核心目标&#xff0c;通过智能匹配算法为求职者和招聘方提供精准的匹配服务。在招聘场景下&#xff0c;该系统运用了机器学习技术&#xff0c;从候选特征工程、协同过滤…

作者头像 李华
网站建设 2026/4/14 23:50:29

计算机Java毕设实战-基于springboot智能鲜花商店销售系统基于springboot的攀枝花市鲜花销售系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/18 8:27:00

冥想第一千七百八十一天(1781)

1.周日&#xff0c;今天天气很好&#xff0c;早上跑步感觉很累&#xff0c;确实退步很大&#xff0c;5:15的配速心率都快150了。 项目上全力以赴的一天。 2.感谢父母&#xff0c;感谢朋友&#xff0c;感谢家人&#xff0c;感谢不断进步的自己。

作者头像 李华
网站建设 2026/4/14 2:13:54

C语言中的运算符

C语言中的运算符非常丰富&#xff0c;大约有40多种&#xff0c;按照功能可以分为以下几类。下面按优先级从高到低整理&#xff0c;并标注结合方向&#xff08;绝大多数是左结合&#xff0c;只有少数特殊的是右结合&#xff09;。 运算符分类与优先级完整对照表&#xff08;C11…

作者头像 李华