【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/7/26 0:34:32 阅读更多 →
如何用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/7/26 1:32:08 阅读更多 →
如何快速上手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/7/26 10:50:10 阅读更多 →

最新新闻

阿里云Qwen3.5-Omni大模型企业级实测与部署指南

阿里云Qwen3.5-Omni大模型企业级实测与部署指南

1. 项目概述 上周刚拿到阿里云Qwen3.5-Omni的测试权限,作为企业技术选型负责人,我花了整整72小时对这个号称"全模态通吃"的大模型进行了全方位实测。从文本生成到多轮对话,从图像理解到文档分析,甚至尝试了跨模态的&quo…

2026/7/26 16:06:24 阅读更多 →
终极指南:如何用yuzu模拟器在PC上畅玩任天堂Switch游戏

终极指南:如何用yuzu模拟器在PC上畅玩任天堂Switch游戏

终极指南:如何用yuzu模拟器在PC上畅玩任天堂Switch游戏 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu 想在电脑上体验《塞尔达传说:王国之泪》、《超级马里奥:惊奇》等Switch独…

2026/7/26 16:06:24 阅读更多 →
USB便携式AI助手实战:基于GGUF与Ollama的离线无审查方案

USB便携式AI助手实战:基于GGUF与Ollama的离线无审查方案

USB AI Agent 实战指南:便携式无审查 AI 助手完整搭建教程在 AI 技术快速发展的今天,很多开发者都希望拥有一个可以随身携带、不受网络限制的本地 AI 助手。传统的云端 AI 服务虽然功能强大,但存在隐私泄露、网络依赖和使用限制等问题。本文将…

2026/7/26 16:06:24 阅读更多 →
公众号自动化写作系统:从爬虫到发布的完整技术方案

公众号自动化写作系统:从爬虫到发布的完整技术方案

1. 项目背景与核心痛点去年接手公司新媒体矩阵运营时,我面临一个棘手问题:如何用3人小团队维持20个公众号的日更需求。传统人工写作模式每天最多产出15-20篇质量合格的文章,直到开发出这套Claw自动化工作流,才真正实现日均百篇的工…

2026/7/26 16:06:24 阅读更多 →
Docker容器网络流量管控与iptables实战指南

Docker容器网络流量管控与iptables实战指南

1. 容器网络流量管控的现实挑战在容器化部署环境中,端口映射是最基础也最常用的网络功能之一。通过-p 8080:80这样的参数,我们可以轻松将容器内的服务暴露给外部网络。但正是这种便捷性,往往让运维人员忽视了背后的安全隐患——每个暴露的端口…

2026/7/26 16:06:24 阅读更多 →
AI简报生成工具:OpenClaw+Chrome插件高效信息处理方案

AI简报生成工具:OpenClaw+Chrome插件高效信息处理方案

1. 项目概述:AI简报生成工具的价值与定位早上8:15分,我像往常一样打开邮箱,发现里面躺着7份行业报告、12篇技术文章和5个产品更新通知——这还只是过去24小时的内容。作为每天需要消化大量信息的从业者,我意识到必须找到更高效的解…

2026/7/26 16:05:24 阅读更多 →

日新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/26 0:00:31 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/26 0:00:31 阅读更多 →

月新闻