【C++ 基础】字符与字符串
ASCLL码表1. 引言从字符到字符串在 C 编程中字符char和字符串string是最基础、最常用的数据类型之一。无论是处理用户输入、文件读写、网络通信还是实现各种文本处理算法都离不开对字符和字符串的操作。然而C 中的字符与字符串处理有着独特的历史背景和多种实现方式从传统的 C 风格字符串到现代的 Cstd::string再到宽字符和多字节字符的支持形成了一个丰富而复杂的体系。本文将深入探讨 C 中字符与字符串的各个方面包括字符类型char,wchar_t,char8_t,char16_t,char32_tC 风格字符串字符数组的原理与操作Cstd::string类的全面使用字符串字面量的各种形式字符编码与国际化支持性能优化与最佳实践2. 字符类型不只是 charC 提供了多种字符类型以适应不同的编码需求和国际化场景。2.1 基本字符类型 charchar是最基本的字符类型通常占用 1 字节8 位可以表示 ASCII 字符集中的 128 个字符。在大多数系统中char默认是有符号的signed char但具体实现可能有所不同。// char 类型的基本使用 char ch1 A; // 字符字面量 char ch2 65; // ASCII 码值 char ch3 \n; // 转义字符换行 char ch4 \x41; // 十六进制表示A char ch5 \101; // 八进制表示A // 输出验证 std::cout ch1: ch1 std::endl; // 输出: A std::cout ch2: ch2 std::endl; // 输出: A std::cout ASCII of ch1: static_castint(ch1) std::endl; // 输出: 65竞赛考点提示在 GESP 和 CSP-J/S 中经常考察字符与 ASCII 码的转换、转义字符的使用。记住常见 ASCII 码A65a97048。2.2 宽字符类型 wchar_twchar_t用于表示宽字符通常用于支持 Unicode 字符。其大小取决于编译器实现Windows 上通常为 2 字节Linux 上通常为 4 字节。#include bits/stdc.h using namespace std; int main() { // wchar_t 的使用 wchar_t wch1 LA; // 宽字符字面量 wchar_t wch2 L中; // 中文字符 wchar_t wstr[] LHello, 世界!; // 宽字符串 // 宽字符输出需要设置本地化 #include locale wcout.imbue(locale()); wcout L宽字符: wch2 endl; wcout L宽字符串: wstr endl; return 0; }竞赛考点提示NOIP 高级组可能涉及宽字符的基本概念但实际编程题中较少使用。了解其存在即可。2.3 固定宽度字符类型C11 起C11 引入了固定宽度的字符类型明确指定了字符的编码方式char8_t用于 UTF-8 编码C20 起char16_t用于 UTF-16 编码char32_t用于 UTF-32 编码#include bits/stdc.h using namespace std; int main() { // 固定宽度字符类型C11/20 char8_t utf8_char u8A; // UTF-8 字符 char16_t utf16_char u中; // UTF-16 字符 char32_t utf32_char U; // UTF-32 字符表情符号 // 对应的字符串字面量 const char8_t* utf8_str u8UTF-8 字符串; const char16_t* utf16_str uUTF-16 字符串; const char32_t* utf32_str UUTF-32 字符串; return 0; }竞赛考点提示GESP 和 CSP-J/S 主要考察基本char类型这些新类型了解即可。2.4 有符号与无符号 charchar、signed char和unsigned char是三种不同的类型#include bits/stdc.h using namespace std; int main() { char c1 A; // 可能是 signed 或 unsigned取决于编译器 signed char c2 -128; // 明确有符号范围-128 到 127 unsigned char c3 255; // 明确无符号范围0 到 255 // 类型转换注意事项 int ascii1 c1; // 可能产生符号扩展问题 int ascii2 static_castunsigned char(c1); // 安全转换 return 0; }竞赛考点提示注意字符类型转换时的符号扩展问题这在 CSP-J/S 的编程题中可能成为陷阱。3. C 风格字符串字符数组C 风格字符串本质上是字符数组以空字符\0作为结束标志。3.1 声明与初始化#include bits/stdc.h using namespace std; int main() { // 多种初始化方式 char str1[] Hello; // 自动计算大小6 字节包含 \0 char str2[10] World; // 指定大小剩余部分填充 \0 char str3[] {H, e, l, l, o, \0}; // 字符数组初始化 char str4[10]; // 未初始化需要后续赋值 // 错误示例 // char str5[5] Hello; // 错误数组太小无法容纳 \0 // char str6[]; // 错误没有初始值无法确定大小 return 0; }竞赛考点提示GESP 和 CSP-J 经常考察字符数组的初始化、大小计算和结束符\0的重要性。3.2 常用操作函数C 标准库提供了一系列字符串操作函数需要包含头文件cstring。#include bits/stdc.h using namespace std; int main() { char str1[20] Hello; char str2[] World; char str3[20]; // 字符串长度不包含 \0 cout str1 length: strlen(str1) endl; // 5 // 字符串复制 strcpy(str3, str1); // str3 Hello strncpy(str3, str2, 3); // str3 Worlo注意不会自动添加 \0 str3[3] \0; // 手动添加结束符 // 字符串连接 strcat(str1, ); // str1 Hello strcat(str1, str2); // str1 Hello World // 字符串比较 int cmp1 strcmp(apple, banana); // 负数apple banana int cmp2 strcmp(hello, hello); // 0相等 int cmp3 strcmp(zoo, apple); // 正数zoo apple // 字符串查找 char text[] The quick brown fox jumps over the lazy dog; char* found strstr(text, fox); // 查找子串 if (found) { cout Found at position: (found - text) endl; } // 字符查找 char* ch_pos strchr(text, q); // 查找字符 if (ch_pos) { cout q found at: (ch_pos - text) endl; } return 0; }竞赛考点提示必须熟练掌握strlen、strcpy、strcat、strcmp、strstr、strchr等函数的使用这是 CSP-J/S 和 NOIP 的必考内容。3.3 安全版本函数C11为了防范缓冲区溢出C11 标准引入了带边界检查的安全版本函数#include bits/stdc.h using namespace std; int main() { // 安全版本函数需要定义 __STDC_LIB_EXT1__ #define __STDC_WANT_LIB_EXT1__ 1 #include cstring char dest[10]; const char* src This is a very long string that might overflow; // 传统函数危险 // strcpy(dest, src); // 可能缓冲区溢出 // 安全版本 errno_t err strcpy_s(dest, sizeof(dest), src); if (err ! 0) { cout Buffer overflow prevented! endl; } return 0; }竞赛考点提示竞赛中通常使用传统函数但要知道缓冲区溢出的风险和安全函数的存在。3.4 优缺点分析优点内存布局简单与 C 语言兼容在某些嵌入式或性能敏感场景中更高效可以直接操作内存灵活性高缺点容易发生缓冲区溢出需要手动管理内存和结束符长度计算需要遍历整个字符串O(n) 复杂度缺乏现代面向对象的封装和安全性4. C std::string现代字符串处理std::string是 C 标准库提供的字符串类封装了字符数组的管理提供了丰富的成员函数。4.1 基本使用#include iostream #include string int main() { // 多种构造方式 std::string s1; // 空字符串 std::string s2 Hello; // 从 C 风格字符串构造 std::string s3(World); // 直接构造 std::string s4(5, A); // 重复字符构造AAAAA std::string s5(s2); // 拷贝构造 std::string s6(s2, 1, 3); // 子串构造ell从位置1开始长度3 std::string s7 std::string(Hello) World; // 临时对象 // 赋值操作 s1 C String; // 赋值 s1.assign(Assigned, 4); // 赋值前4个字符Assi // 获取 C 风格字符串 const char* c_str s2.c_str(); // 返回 const char* const char* data_ptr s2.data(); // C17 起与 c_str() 相同 return 0; }竞赛考点提示CSP-S 和 NOIP 中std::string的使用频率远高于 C 风格字符串必须熟练掌握各种构造方式。4.2 字符串操作#include iostream #include string int main() { std::string str Hello, C World!; // 长度和容量 std::cout Length: str.length() std::endl; // 17 std::cout Size: str.size() std::endl; // 17与 length 相同 std::cout Capacity: str.capacity() std::endl; // 当前分配的容量 std::cout Empty: (str.empty() ? Yes : No) std::endl; // 访问字符 char first str[0]; // H不检查边界 char second str.at(1); // e检查边界越界抛出异常 char last str.back(); // !C11 char front str.front(); // HC11 // 修改内容 str.append( Welcome!); // 追加字符串 str.push_back(!); // 追加单个字符 str.insert(7, Modern ); // 在位置7插入 str.erase(5, 2); // 从位置5删除2个字符 str.replace(7, 3, Standard); // 从位置7开始替换3个字符 // 查找 size_t pos1 str.find(World); // 查找子串 size_t pos2 str.find(W); // 查找字符 size_t pos3 str.find(Java); // 未找到返回 std::string::npos // 提取子串 std::string sub1 str.substr(7); // 从位置7到结尾 std::string sub2 str.substr(0, 5); // 前5个字符 // 比较 int cmp str.compare(Hello, C World!); // 返回0表示相等 // 清空和释放内存 str.clear(); // 清空内容 str.shrink_to_fit(); // 释放多余内存C11 return 0; }竞赛考点提示find、substr、erase、insert等函数是字符串处理题目的核心必须熟练掌握。4.3 字符串与数值转换#include iostream #include string #include sstream #include cstdlib // 用于 C 风格转换 int main() { // 字符串转数值C11 起 std::string num_str 123.45; int int_val std::stoi(num_str); // 转整数 long long_val std::stol(num_str); // 转长整数 float float_val std::stof(num_str); // 转单精度浮点数 double double_val std::stod(num_str); // 转双精度浮

相关新闻

AM62L硬件防火墙权限寄存器配置实战:从总线错误到安全内存隔离

AM62L硬件防火墙权限寄存器配置实战:从总线错误到安全内存隔离

1. 从寄存器手册到实战:理解AM62L防火墙权限配置的核心逻辑 最近在调试一块基于TI AM62L处理器的工控板卡时,遇到了一个典型的“内存访问被拒”问题。一个运行在非安全世界(Non-Secure World)的用户态(User Mode&#…

2026/9/24 22:31:42 阅读更多 →
如何用Mermaid Live Editor在5分钟内创建专业流程图:新手终极指南

如何用Mermaid Live Editor在5分钟内创建专业流程图:新手终极指南

如何用Mermaid Live Editor在5分钟内创建专业流程图:新手终极指南 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-…

2026/9/23 12:18:01 阅读更多 →
如何快速上手LFM2.5-Embedding-350M-8bit:5分钟完成多语言文本相似度计算

如何快速上手LFM2.5-Embedding-350M-8bit:5分钟完成多语言文本相似度计算

如何快速上手LFM2.5-Embedding-350M-8bit:5分钟完成多语言文本相似度计算 【免费下载链接】LFM2.5-Embedding-350M-8bit 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/LFM2.5-Embedding-350M-8bit LFM2.5-Embedding-350M-8bit是一款基于MLX框…

2026/9/24 12:55:30 阅读更多 →

最新新闻

使用 lego 与 myaddr.{tools,dev,io} 配置 DNS-01 挑战获取通配符证书

使用 lego 与 myaddr.{tools,dev,io} 配置 DNS-01 挑战获取通配符证书

网络安全密码学 【免费下载链接】lego Lets Encrypt/ACME client and library written in Go 项目地址: https://gitcode.com/gh_mirrors/le/lego 点击查看 免费下载 本文是基于 lego 开源 ACME 客户端库,为 myaddr.{tools,dev,io} 动态 DNS 服务编写的…

2026/9/25 5:32:27 阅读更多 →
Two.js 安全指南:客户端渲染库的 SVG 攻击面、CSP 加固与漏洞报告流程

Two.js 安全指南:客户端渲染库的 SVG 攻击面、CSP 加固与漏洞报告流程

图形学前端 【免费下载链接】two.js A renderer agnostic two-dimensional drawing api for the web 项目地址: https://gitcode.com/gh_mirrors/tw/two.js 点击查看 免费下载 Two.js 是一个渲染器无关的二维绘图 API,它会在浏览器中以 Canvas、SVG 或 …

2026/9/25 5:32:27 阅读更多 →
PaddleSeg FastFCN 实战指南:JPU 联合金字塔上采样与语义编码模块的源码级解析

PaddleSeg FastFCN 实战指南:JPU 联合金字塔上采样与语义编码模块的源码级解析

人工智能计算机视觉预训练 【免费下载链接】PaddleSeg Easy-to-use image segmentation library with awesome pre-trained model zoo, supporting wide-range of practical tasks in Semantic Segmentation, Interactive Segmentation, Panoptic Segmentation, Image Matting,…

2026/9/25 5:32:26 阅读更多 →
CodeCombat AP CSP 第二单元“Hitchhiker‘s Guide“算法活动详解:不可解问题、不可判定问题与停机问题

CodeCombat AP CSP 第二单元“Hitchhiker‘s Guide“算法活动详解:不可解问题、不可判定问题与停机问题

游戏开发教育前端后端 【免费下载链接】codecombat Game for learning how to code. 项目地址: https://gitcode.com/gh_mirrors/co/codecombat 点击查看 免费下载 本文围绕 CodeCombat AP Computer Science Principles(AP CSP)课程中的活动…

2026/9/25 5:32:26 阅读更多 →
Oracle 11.2.0.4 PSU补丁安装全解析:单实例与RAC滚动

Oracle 11.2.0.4 PSU补丁安装全解析:单实例与RAC滚动

简介:面向 Oracle 数据库管理员与系统运维人员的 11.2.0.4 版本补丁集更新(PSU)压缩包,对应 2022 年 1 月发布的 p33477185 补丁,适用于 Linux x86-64 环境。该更新聚合了安全修复、性能优化与已知问题解决方案&#x…

2026/9/25 5:32:26 阅读更多 →
从Gitee的signature参数讲起:签名校验原理与微信支付/Gitee避坑指南

从Gitee的signature参数讲起:签名校验原理与微信支付/Gitee避坑指南

前几天帮一个朋友排查 Gitee 仓库的访问问题,他发来一个链接,长这样:signaturee4fa5b50b039cd49ee71b9289ac6c58e,db.json zhanghaiqing/qq1026295417 - Gitee.com。链接本身是 Gitee 上一个名为db.json的文件,仓库作者叫zhangha…

2026/9/25 5:31:26 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →