当前位置: 首页 > news >正文

C/C++字符串

1.C 语言中的字符串

C 语言没有专门的 “字符串类型”,字符串的本质:字符串是通过字符数组(char[] 间接表示的,其本质是以空字符 '\0' 结尾的字符序列(称为 “C 风格字符串”)。

定义方式:

// 字符数组初始化(自动添加 '\0' 结尾)
char str1[] = "hello";  // 等价于 {'h','e','l','l','o','\0'}
char str2[6] = {'h','e','l','l','o','\0'};  // 必须显式添加 '\0'

关键特性:

依赖空字符 '\0' 标识结束(否则字符串函数无法判断长度);

本质是 char 类型的数组,需手动管理内存(长度固定,或通过指针动态分配);

操作依赖 <string.h> 库函数(如 strlen 求长度、strcpy 复制、strcat 拼接等)。

2. C++ 中的字符串

C++ 兼容 C 风格的字符数组,同时提供了标准库中的 std::string 类型(属于类类型),专门用于处理字符串,更安全、便捷。

定义方式:

#include <string>  // 必须包含头文件
using namespace std;  // 或显式使用 std::stringstd::string str = "hello";  // 直接初始化,无需手动添加 '\0'

关键特性:

属于 std 命名空间下的类(std::string),封装了字符串的存储和操作。

自动管理内存(长度可动态变化,无需手动分配 / 释放);

支持直接用 + 拼接、[] 访问字符、length() 获取长度等直观操作;

可与 C 风格字符串相互转换(通过 c_str() 方法获取 C 风格字符串指针)。

3.string和字符数组的区别

在 C 语言中,需要先明确一个重要前提:C 语言没有原生的 string 类型(这一点和 C++ 的 std::string 不同)。我们通常说的 “C 语言字符串”(简称 “C 字符串”),本质是一种特殊的字符数组—— 它必须以空字符 '\0' 作为结尾,用于标识字符串的结束。

普通字符数组:是 char 类型元素的集合,仅存储字符序列,不要求必须包含 '\0'。其长度由初始化时的元素个数或定义时指定的大小决定。

// 普通字符数组(无 '\0' 结尾)
char arr1[] = {'h', 'i'};  // 长度为 2(仅包含 'h'、'i')
char arr2[5] = {'a', 'b'}; // 长度为 5(前 2 个是 'a'、'b',后 3 个默认填充 '\0',但这是编译器行为,非必须)

C 字符串:是以 '\0' 结尾的字符数组'\0' 是字符串的 “结束标志”(不属于有效字符)。其 “字符串长度”(有效字符数)是 '\0' 之前的字符个数,数组实际长度需至少比字符串长度多 1(容纳 '\0')。

// C 字符串(自动添加 '\0' 结尾)
char str1[] = "hello";  // 等价于 {'h','e','l','l','o','\0'},数组长度 6,字符串长度 5
char str2[6] = {'h','i','\0'};  // 显式添加 '\0',数组长度 6,字符串长度 2

C 语言的字符串函数(如 <string.h> 中的 strlenstrcpystrcatprintf("%s") 等)仅能正确处理 “以 '\0' 结尾的字符数组”(即 C 字符串),因为它们依赖 '\0' 来判断字符串的结束位置。

对 C 字符串 使用字符串函数:行为正确。

char str[] = "test";
printf("%s", str);  // 正确输出 "test"(找到 '\0' 后停止)
int len = strlen(str);  // 正确返回 4(仅统计 '\0' 前的字符)

对 普通字符数组(无 '\0' 结尾) 使用字符串函数:行为未定义(可能越界访问)。

char arr[] = {'a', 'b'};  // 无 '\0' 结尾
printf("%s", arr);  // 错误:会一直打印直到内存中随机遇到 '\0',可能输出乱码
int len = strlen(arr);  // 错误:结果随机(越界查找 '\0')

本质关系:

C 字符串是一种特殊的字符数组:它在普通字符数组的基础上,强制要求以 '\0' 结尾,从而能被字符串函数识别和处理。

普通字符数组若手动添加 '\0' 结尾,就会变成 C 字符串。例如:

char arr[] = {'a', 'b', '\0'};  // 此时 arr 就是一个 C 字符串(长度 2)

在 C 语言中,不能说字符串的数据类型是 char*,但 char*(字符指针)是最常用的操作字符串的工具char* 是 “字符指针类型”,它本身不是字符串类型,但它可以向字符串(字符数组)的首地址,从而通过指针操作字符串。

// 字符串(字符数组)
char str[] = "hello";  // 类型是 char[6](数组类型)// char* 指针指向字符串的首地址
char* p = str;  // p 指向 str[0]('h'),通过 p 可以访问整个字符串

此时,p 的类型是 char*,但它指向的是字符串(str 这个字符数组)。我们操作字符串时(如用 printf("%s", p) 打印、用 strlen(p) 计算长度),本质是通过 char* 指针找到字符串的起始位置,再按 “'\0' 结尾” 的规则遍历。

http://www.dtcms.com/a/491438.html

相关文章:

  • 上网站乱码python网站开发效率
  • 告别“搬砖”:在AI的辅助下,前端如何触及业务与架构的深水区?
  • 大显存 AI 训练实战:PyTorch/TensorFlow 参数调试与多场景落地指南
  • 石狮新站seo电子商务网站建设与管理感想
  • Socket 抓包工具与实战,从抓取到定位(Socket 的命令、分析)
  • 让安全驾驶有“AI”相伴|腾视科技DMS视频监控一体机,守护每一次出行
  • 软考高项论文考试攻略1:从趋势分析到实战技巧
  • C语言:自定义类型
  • MATLAB中双馈发电机与无刷双馈发电机低电压穿越的异同分析
  • 做公司网站需要多南京建设行政主管部门网站
  • 【CDA案例】某女装品牌如何用AARRR 模型落地实践使私域增长突围的?5分钟get到​重点
  • 企业电话交换机配置在线聊天功能安装文档
  • 公司做网站需要什么条件程序员培训机构出来找工作好找吗
  • Python3编程之Python基础(更新中...)
  • 从概念到实战:一文读懂实时操作系统(RTOS),并洞悉其与Linux/Windows的本质区别
  • 网站建设谈单思路互联网保险的特点不包括
  • 从边缘到云端:Takebishi如何比Kepware更快打通IIoT数据链路
  • uniapp :class不支持 getAvatarClass(currentContact.type) 语法 导致的问题
  • List导出到Excel文件
  • PLD-150电液伺服钢管弯曲疲劳试验台
  • 个人可以做社区网站有哪些深圳市网站开发
  • 视频一页网站怎么做北京高端网站建设有限公司
  • asp.net做三个网站官网搭建
  • xr-frame微信小程序xr-ar-tracker实现video视频竖屏或横屏播放
  • JavaScript this 关键字详解
  • 镇江网站制作服务网站功能插件
  • 假电影网站做注册静态网站建设背景
  • 如何利用云服务器进行网站建设厦门网站优化服务
  • 【 广州产权交易所-注册安全分析报告-无验证方式导致安全隐患】
  • MySQL 高级分表与分库实践指南