C++数组与字符串:从基础到实战技巧

C++中的数组和字符串是处理数据集合和文本的基础工具。数组用于存储相同类型的元素集合,而字符串则专门用于处理文本数据。C++提供了两种主要的字符串处理方式:C风格字符串(字符数组)和C++的std::string类。

📊 1. 数组 (Arrays)

数组是相同类型元素的集合,这些元素在内存中连续存储。数组的大小在定义时确定,且不能改变。

一维数组

  • 声明与初始化

    数组的声明需要指定元素类型、数组名和大小。初始化可以在声明时进行。

    int numbers[5];// 声明一个包含5个整数的数组,未初始化int numbers[5] = {1, 2, 3, 4, 5};// 声明并初始化int numbers[] = {1, 2, 3, 4, 5};// 编译器自动计算大小

    如果初始化值少于数组元素,剩余元素会自动初始化为0(对于基本数据类型)

  • 访问元素

    通过索引访问数组元素,索引从0开始。

    int first = numbers[0];// 访问第一个元素
    numbers[4] = 10;// 修改第五个元素
  • 特点

    • 内存连续,访问高效。
    • 大小固定,无法动态扩容。
    • 需注意数组越界访问,这可能引发未定义行为。

多维数组

多维数组,如二维数组,可视为“数组的数组”,常用于表示矩阵或表格。

  • 声明与初始化

    int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};// 2行3列int matrix[2][3] = {1, 2, 3, 4, 5, 6};// 按顺序初始化
  • 访问元素

    使用多个索引访问元素。

    int value = matrix[1][2];// 访问第二行第三列(值为6)

动态数组

使用newdelete[]在堆上动态分配和释放内存。

int size = 5;
int* dynamicArray = new int[size];// 动态分配// 使用 dynamicArray...delete[] dynamicArray;// 释放内存

动态数组需手动管理内存,防止内存泄漏。

🔤 2. 字符串 (Strings)

C++中有两种主要的字符串表示方式:C风格字符串和std::string类。

C风格字符串 (C-Style Strings)

C风格字符串本质是以空字符'\0'结尾的字符数组

  • 声明与初始化

    char str1[] = "Hello";// 编译器自动添加'\0',数组长度为6char str2[6] = {'H', 'e', 'l', 'l', 'o', '\0'};// 手动添加终止符

    字符串字面量用双引号括起,编译器会自动在其末尾添加空字符

  • 常用函数

    使用C标准库函数(需包含<cstring>)进行操作:

    #include <cstring>char str1[20] = "Hello";
    char str2[] = "World";strlen(str1);// 获取字符串长度(不包括'\0')strcpy(str1, str2);// 复制字符串(需确保目标空间足够)strcat(str1, "!");// 连接字符串(需确保目标空间足够)strcmp(str1, "Hello World!");// 比较字符串(相等返回0)

    注意:使用strcpystrcat等函数时,必须确保目标字符数组有足够的空间,否则可能导致缓冲区溢出

std::string类

C++标准库提供的std::string类(需包含<string>头文件)封装了字符串操作,自动管理内存,更安全便捷

  • 声明与初始化

    #include <string>
    std::string s1;// 空字符串
    std::string s2 = "Hello, World!";// 初始化std::string s3(s2);// 拷贝构造
  • 常用操作

    std::string支持丰富的操作:

    s1 = "Hello"; s2 = "World";
    std::string s4 = s1 + ", " + s2;// 字符串拼接(使用+运算符)
    s1.append(" World!");// 追加字符串int len = s1.length();// 或 s1.size(),获取字符串长度char ch = s1[0];// 通过索引访问字符(不检查边界)
    ch = s1.at(0);// 使用at()访问(会检查边界,越界抛出异常)std::string sub = s1.substr(7, 5);// 提取子串(从位置7开始,长度为5)size_t pos = s1.find("World");// 查找子串,返回首次出现的位置(未找到返回std::string::npos)
    s1.replace(7, 5, "C++");// 替换子串(从位置7开始,替换5个字符为"C++")
    s1.insert(7, "Beautiful ");// 插入字符串
    s1.erase(7, 10);// 删除子串(从位置7开始,删除10个字符)if (s1 == s2) {/* 比较字符串 */ }// 支持关系运算符比较
  • 输入输出

    使用getline读取整行文本(包括空格):

    std::string name;
    std::cout << "Enter your full name: ";
    std::getline(std::cin, name);// 读取整行
    std::cout << "Hello, " << name << std::endl;

    使用cin进行输入时,遇到空格、制表符或换行符会停止读取

转换

  • std::string与 C风格字符串互转

    std::string s = "Hello";
    const char* cstr1 = s.c_str();// 转换为C风格字符串(只读,指向s的内部数据)const char* cstr2 = s.data();// C++17前与c_str()类似,C++17起可能不以空字符结尾char arr[20];
    std::strcpy(arr, s.c_str());// 将s的内容复制到可修改的字符数组arr中const char* cstr = "World";
    std::string s_from_c = cstr;// C风格字符串转换为std::string

    注意:c_str()返回的指针在std::string对象发生修改后可能失效

⚖️ 3. 对比与选择

特性C风格字符串std::string
内存管理手动管理,易出错自动管理,避免泄漏
安全性易缓冲区溢出/越界更安全,边界检查
功能基础函数(strlen, strcpy等)丰富方法(拼接、查找、替换等)
性能开销小,适合底层或嵌入式动态扩容可能带来开销,但通常更便捷

建议:在现代C++开发中,优先使用std::string,除非在与C代码交互或对性能有极端要求的场景下才考虑使用C风格字符串

💡 4. 注意事项

  1. 数组越界:访问数组时,确保索引在[0, size-1]范围内,越界访问会导致未定义行为。
  2. 字符串结束符:操作C风格字符串时,务必确保其以'\0'结尾,否则相关字符串函数可能无法正常工作甚至导致程序崩溃。
  3. 空间充足:对C风格字符串进行拼接、复制等操作前,务必确认目标字符数组有足够的空间,防止缓冲区溢出。
  4. std::stringc_str():不要存储c_str()返回的指针并在后续修改std::string对象,除非已重新获取。该指针指向的数据可能在std::string修改后失效。

掌握数组和字符串的基础知识是进行有效C++开发的关键。根据具体场景选择合适的工具,并始终牢记安全操作的准则。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/922361.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/922361.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

艾迈斯欧司朗推出首款高功率多芯片激光器封装

在投影显示领域掀起技术革新的浪潮中&#xff0c;艾迈斯欧司朗犹如一位技艺精湛的工匠&#xff0c;精心打造出Vegalas Power系列高功率激光二极管的首颗明珠——PLPM7_455QA激光器。这款采用多颗GaN基功率激光器集成封装的新品&#xff0c;在短脉冲周期内绽放出42W的璀璨光芒&a…

机器视觉中的工业相机接口该如何选择?

工业相机接口&#xff1a;数据传输的“高速公路”&#xff0c;选对了才够快 在机器视觉系统里&#xff0c;工业相机就像“眼睛”&#xff0c;而接口则是连接“眼睛”与“大脑”&#xff08;后端处理系统&#xff09;的“高速公路”。这条“路”的宽窄、长短、抗干扰能力&#x…

[数据结构——lesson10.2堆排序以及TopK问题]

目录 前言 学习目标 堆排序 TopK问题&#xff1a; 解法一&#xff1a;建立N个数的堆 解法二&#xff1a;建立K个数的堆&#xff08;最优解&#xff09; 完整代码 结束语 前言 上节内容我们详细讲解了堆[数据结构——lesson10.堆及堆的调整算法]&#xff0c;接下来我们…

使用HTTPS 服务在浏览器端使用摄像头的方式解析

1.方式1 // vite.config.js import { defineConfig } from vite import vue from vitejs/plugin-vue import basicSsl from vitejs/plugin-basic-sslexport default defineConfig({plugins: [vue(),basicSsl({name: test,domains: [192.168.15.166, localhost], // 添加您的IPc…

上下文管理器和异步I/O

目录 一、上下文管理器 1.1 定义 1.2 特点 1.3 适用场景 1.4 具体实现 1.5 具体实例 1.5.1 文件管理器 1.5.2 线程锁释放资源 二、异步I/O 2.1 定义 2.2 特点 2.3 实现方式 2.4 适用场景 高并发网络服务&#xff1a;Web服务器、API服务等需要处理大量并发连接 2…

LabVIEW信号监测与分析

借助 LabVIEW 平台&#xff0c;生成含正弦波与噪声的信号&#xff0c;经频谱分析等处理&#xff0c;结合动态限值判断信号是否超限&#xff0c;广泛用于音频、振动等领域的信号监测&#xff0c;助力高效开展信号分析与质量把控。概念说明系统围绕信号的生成、处理、分析及监测展…

MySQL数据库与表的创建、修改及数据操作指南

精选专栏链接 &#x1f517; MySQL技术笔记专栏Redis技术笔记专栏大模型搭建专栏Python学习笔记专栏深度学习算法专栏 欢迎订阅&#xff0c;点赞&#xff0b;关注&#xff0c;每日精进1%&#xff0c;与百万开发者共攀技术珠峰 更多内容持续更新中&#xff01;希望能给大家带来…

​new species of flying reptile1 discovered in Scotland​

Pterosaur: new species of flying reptile1 discovered in Scotland 苏格兰斯凯岛发现新翼龙物种 考古学家们在苏格兰斯凯岛发现了一个新的翼龙物种。这种独特的飞行爬行动物生活在1.68 – 1.66亿年前。 This flying reptile soared over the heads of dinosaurs2 when Scotla…

03 节点行为

审批流程图如下图&#xff0c;在此流程图中&#xff0c;存在两个UserTask节点&#xff0c;第一个节点是主管审批&#xff0c;第二个节点是产品经理审批&#xff0c;两个节点中间有一个排他网关&#xff0c;此网关用来对主管审批的结果进行判断&#xff0c;如果主管审批通过&…

深度卷积生成对抗网络详解与实现

深度卷积生成对抗网络详解与实现 0. 前言 1. 网络架构 1.1 批归一化 1.2 激活 1.3 上采样 2. 构建 DCGAN 2.1 生成器 2.2 判别器 2.3 训练 DCGAN 0. 前言 深度卷积生成对抗网络 (Deep Convolutional Generative Adversarial Network, DCGAN) 是基于生成对抗网络 (Generative A…

CF607B Zuma -提高+/省选-

CF607B Zuma codeforces 原链接 题目描述 Genos\texttt{Genos}Genos 最近在他的手机上下载了祖玛游戏。在祖玛游戏里&#xff0c;存在 nnn 个一行的宝石&#xff0c;第 iii 个宝石的颜色是 CiC_iCi​。这个游戏的目标是尽快的消灭一行中所有的宝石。 在一秒钟&#xff0c;Ge…

拆分了解HashMap的数据结构

文章目录 前言 一、底层数据结构总览 二、核心组成部分详解 1. 数组&#xff08;哈希表&#xff09; 2. 节点&#xff08;Node&#xff09; 3. 红黑树&#xff08;TreeNode&#xff09; 三、哈希函数与索引计算 四、哈希冲突的解决 五、扩容机制 六、关键特性与注意事…

关于电脑连接不到5g的WiFi时的一些解决办法

方法一、设备管理器重卸载驱动后&#xff0c;重装驱动。方法二、打开控制面板 “控制面板\网络和 Internet\网络连接” &#xff08;亲测有效&#xff09;点击更改适配器配置右击当前的WLAN属性点击配置选择“高级” 802.11a/b/g 无线模式选项栏 值&#xff1a;6.的双…

Mathtype公式批量编号一键设置公式居中编号右对齐

插件[ygtools] 批量编号一键设置公式居中编号右对齐 单栏/多栏均可https://wwon.lanzout.com/i0NRf35vyw8j 下载密码8543

基于ssm的小橘子出行客户体验评价系统[SSM]-计算机毕业设计源码+LW文档

摘要&#xff1a;随着出行行业的快速发展&#xff0c;客户体验评价对于出行服务质量的提升至关重要。本文设计并实现了基于SSM&#xff08;Spring Spring MVC MyBatis&#xff09;框架的小橘子出行客户体验评价系统。该系统涵盖系统用户管理、司机信息管理、客户评价管理等功…

算法日记---二分查找

目录 前言 一、二分查找 1.思想 2.简单二分 3.优点 4.局限性 二、模板 1.基本模板 2.简单例题&#xff08;LeetCode&#xff09; 4.有重复元素的二分 5.0-1问题 总结 前言 本文通过讲解简单的二分查找配合leetcode例题对二分查找本质、模板进行了基础的总结 提示&a…

Level Set(水平集)算法——形象化讲解

目录 维度一&#xff1a;核心思想与比喻&#xff08;它像什么&#xff1f;&#xff09; 维度二&#xff1a;要解决什么问题&#xff1f;&#xff08;它能干嘛&#xff1f;有什么用&#xff1f;&#xff09; 维度三&#xff1a;工作原理&#xff08;它是怎么做到的&#xff1…

DDoS 攻防“军备竞赛”的幕后

谈到 DDoS&#xff08;分布式拒绝服务攻击&#xff09;&#xff0c;很多人会想到“黑客租用肉鸡发流量&#xff0c;网站直接崩”。但事实上&#xff0c;如今的 DDoS 攻防早已变成一场 军备竞赛。攻击者的武器越来越“工业化”&#xff1a;僵尸网络商品化&#xff1a;黑市上&…

如何用 Rust 重写 SQLite 数据库(二):是否有市场空间?

用 Rust 实现一个类似 SQLite 的嵌入式数据库非常有意义&#xff0c;但需要结合具体目标和场景来评估其价值。以下从技术、生态、市场需求和个人成长等多个维度展开分析&#xff0c;并给出结论。一、技术价值&#xff1a;Rust 与数据库的天然契合 SQLite 作为全球装机量最大的数…

【Web】ImaginaryCTF 2025 wp

目录 imaginary-notes certificate codenames-1 passwordless pearl imaginary-notes I made a new note taking app using Supabase! Its so secure, I put my flag as the password to the "admin" account. I even put my anonymous key somewhere in the si…