C++ 数组与字符串全解析:从基础到应用

news2025/1/15 13:59:06

目录

数组和字符串

(一)数组(在 C++ 中)

1.一维数组

2.二维数组

(二)C - style 字符串

(三)C++ string 类


数组和字符串

(一)数组(在 C++ 中)

1.一维数组
  • 定义
    格式为 数据类型 数组名[数组大小];,例如 int arr[5]; 就定义了一个名为 arr,能存放 5 个 int 类型元素的一维数组。数组大小必须是常量表达式,在编译时就能确定其值。
  • 初始化
    可以在定义时进行初始化,像 int arr[5] = {1, 2, 3, 4, 5}; 这种方式是完全初始化,也可以部分初始化,比如 int arr[5] = {1, 2};,此时未被初始化的元素会被自动初始化为对应数据类型的默认值(对于 int 类型就是 0)。还能省略数组大小让编译器自动根据初始化元素个数来确定,如 int arr[] = {1, 2, 3};,编译器会将数组 arr 的大小确定为 3。
  • 访问
    通过下标来访问数组元素,下标从 0 开始。例如上面定义的 arr 数组,arr[0] 表示访问第一个元素(值为 1),arr[4] 表示访问第五个元素。要注意访问时不能超出数组定义的下标范围,否则会导致越界访问,引发程序错误,比如访问 arr[5] 就是越界了(因为合法下标是 0 到 4)。
    #include <iostream>
    using namespace std;
    
    int main() {
        int arr[3] = {11,22,33};
        for (int i = 0;i < 3;i++) {
            std::cout << arr[i] << std::endl;
        }
        return 0;
    }
    

2.二维数组
  • 概念
    二维数组可以理解为是一种 “数组的数组”,它的逻辑结构类似表格,有行和列。定义格式如 数据类型 数组名[行数][列数];,例如 int matrix[3][4]; 定义了一个 3 行 4 列的二维数组,用来存放 int 类型的数据。
  • 初始化
    可以按行初始化,例如 int matrix[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} };,每一对大括号内对应一行元素的值。也可以整体初始化,像 int matrix[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};,编译器会按顺序依次给元素赋值,不过按行初始化的方式可读性更好。同样可以省略第一维的大小让编译器根据初始化情况确定,前提是对第二维大小有明确指定,比如 int matrix[][4] = { {1, 2, 3, 4}, {5, 6, 7, 8} };,编译器能判断出这里是 2 行 4 列的二维数组。
  • 访问
    使用两个下标来访问元素,第一个下标表示行,第二个下标表示列,都是从 0 开始计数。例如对于上面定义的 matrix 数组,matrix[1][2] 表示访问第二行第三列的元素(值为 7)。
#include <iostream>
using namespace std;

int main() {
    int arr[][3] = {{11, 22},33};
    for (int i = 0;i < 2;i++) {
        for (int j = 0; j < 3; ++j) {
            std::cout << arr[i][j] << std::endl;
        }
    }
    return 0;
}

 

(二)C - style 字符串

  • 本质
    是以 '\0'(空字符,ASCII 值为 0)结尾的字符数组。例如 char str[] = "hello";,实际上在内存中存储的是 {'h', 'e', 'l', 'l', 'o', '\0'},这个 '\0' 用于标识字符串的结束位置,这样在处理字符串相关操作时,函数就能通过检测 '\0' 来确定字符串的长度等信息。
  • 常用字符串处理函数
    • strcpy:用于将一个字符串复制到另一个字符数组中。例如 char dest[20]; char src[] = "source"; strcpy(dest, src);,会把 src 字符串(包括结尾的 '\0')复制到 dest 字符数组中。需要注意的是,dest 数组要有足够的空间来存放要复制的字符串,不然会导致缓冲区溢出等错误。
    • strcat:用于把一个字符串连接到另一个字符串的末尾。比如 char str1[20] = "hello"; char str2[] = " world"; strcat(str1, str2);,执行后 str1 的内容就变成了 "hello world",同样要保证 str1 有足够空间来容纳连接后的结果。
    • strcmp:用来比较两个字符串的大小关系。它按字符的 ASCII 值逐个比较两个字符串对应位置的字符,直到遇到不同字符或者到达 '\0' 结束。如果两个字符串相等返回 0,如果第一个字符串大于第二个字符串返回一个正值,如果第一个字符串小于第二个字符串返回一个负值。例如 char str1[] = "abc"; char str2[] = "abd"; int result = strcmp(str1, str2);,这里 result 的值就小于 0,因为 'c' 的 ASCII 值小于 'd'
int main() {
    char dest[20] = {'0'};
    char src[] = "source";
    std::cout << dest << std::endl;
    strcpy(dest, src);
    std::cout << src << std::endl;
    std::cout << dest << std::endl;
    return 0;
}

 

int main() {
    char str1[20] = "hello";
    char str2[] = " world";
    strcat(str1, str2);
    std::cout << str1 << std::endl;
    return 0;
}

int main() {
    char str1[] = "abc";
    char str2[] = "abd";
    int result = strcmp(str1, str2);
    std::cout << result << std::endl;
    return 0;
}

(三)C++ string 类

  • 定义与初始化
    可以直接用字符串字面量来初始化,如 string str = "Hello";,也可以通过构造函数等其他方式初始化,比如 string str1(5, 'a'); 会初始化出一个包含 5 个 'a' 字符的字符串。
  • 基本操作
    • 字符串拼接:可以使用 + 运算符方便地进行字符串拼接,例如 string str1 = "Hello"; string str2 = " world"; string result = str1 + str2;result 的内容就是 "Hello world"。而且还能和字符串字面量拼接,像 string str = "Hello"; str = str + " C++";
    • 字符访问:通过 [] 运算符来访问字符串中的单个字符,例如 string str = "abc"; char ch = str[1];,这里 ch 的值就是 'b',不过要注意访问时不能超出字符串的有效范围(下标不能小于 0 且不能大于等于字符串长度)。
    • 获取长度:使用 length() 或者 size() 函数可以获取字符串的长度,例如 string str = "abc"; int len = str.length();,这里 len 的值就是 3。
    • 其他操作:还有很多实用的函数,比如 find() 函数用于查找子字符串在字符串中的位置,substr() 函数可以提取字符串中的一部分内容等。
int main() {
    string str = "Hello";
    str = str + " C++";
    std::cout << str << std::endl;
    string strq = "abc";
    char ch = strq[1];
    std::cout << ch << std::endl;
    std::cout << str.length() << std::endl;
    std::cout << str.size() << std::endl;
    return 0;
}

总的来说,C - style 字符串在 C++ 中依然可以使用,但 string 类提供了更方便、更安全且功能更丰富的字符串操作方式,在实际的 C++ 编程中被广泛应用。 而数组无论是一维还是二维,都是存储一组相同类型数据的有效方式,方便对批量数据进行处理。

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

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

相关文章

Git常用的命令【提交与回退】

git分布式版本控制系统 &#xff08;SVN集中式版本控制系统&#xff09;之间的对比 git有本地仓库和远程仓库&#xff0c;不同的开发人员可以分别提交自己的本地仓库并维护代码的版本控制。 然后多个人员在本地仓库协作的代码&#xff0c;可以提交到远程仓库中做整合。 git本…

JAVA秋招面试题精选-第一天总结

目录 分栏简介&#xff1a; 问题一&#xff1a;订单表每天新增500W条数据&#xff0c;分库分表应该怎么设计&#xff1f; 问题难度以及频率&#xff1a; 问题导向&#xff1a; 满分答案&#xff1a; 举一反三&#xff1a; 问题总结&#xff1a; 问题二&#xff1a;解释…

C—初阶结构体

若是阁下满意的话&#xff0c;能否一键三连呢&#xff01;&#xff01;&#xff01;&#xff01; 结构体基础知识&#xff1a; 概念&#xff1a;结构体是一些值的集合&#xff0c;这些值称为变量&#xff0c;变量可以是不同类型 这里我们再想一下之前的数组&#xff0c;数组是一…

物品识别 树莓派 5 YOLO v5 v8 v10 11 计算机视觉

0. 要实现的效果 让树莓派可以识别身边的一些物品&#xff0c;比如电脑&#xff0c;鼠标&#xff0c;键盘&#xff0c;杯子&#xff0c;行李箱&#xff0c;双肩包&#xff0c;床&#xff0c;椅子等 1. 硬件设备 树莓派 5 raspberrypi.com/products/raspberry-pi-5/树莓派官方摄…

JS学习(1)(基本概念与作用、与HTML、CSS区别)

目录 一、JavaScript是什么&#xff1f; &#xff08;1&#xff09;基本介绍 &#xff08;2&#xff09;简称&#xff1a;JS&#xff1f; 二、JavaScript的作用。 三、HTML、CSS、JS之间的关系。 &#xff08;1&#xff09;html、css。 &#xff08;2&#xff09;JavaScript。 …

matlab读取NetCDF文件

matlab对NetCDF文件进行信息获取和读取数据 文章目录 前言一、什么是NetCDF文件二、读取NetCDF文件数据 1.引入库 2.读入数据总结 前言 在气象学中&#xff0c;许多气象数据存储在NetCDF文件中&#xff0c;后缀为.nc&#xff0c;通常可以用NCL、python和MATLAB等对该…

shell自动显示当前git的branch

效果简介&#xff1a; 1. 如果没在git仓库&#xff0c;显示无变化 2. 如果在git仓库&#xff0c;显示当前分支 实现方法&#xff1a; 在~/.bashrc 里添加&#xff1a; function git_branch { test -d .git && branch"git branch | grep "^\*" | sed…

第四十一天 ASP应用 HTTP.sys 漏洞 iis6文件解析漏洞和短文件漏洞 access数据库泄露漏洞

前言 随着时代的发展现在呀&#xff0c;这个ASp已经淡出大众的视线了 &#xff0c;ASP之前的火爆程度无异于现在的PHP 大家的童年 4399 什么的网站都是这个搭建的ASP 简介 | 菜鸟教程 那大家想问为什么你妹的 这个这么火的网站搭建语言被淘汰了呢 其实多半是以为它的不开…

Java——常用类(下)

时间类 “时间如流水&#xff0c;一去不复返”&#xff0c;时间是一维的。所以&#xff0c;我们需要一把刻度尺来表达和度量时间。在计算机世界&#xff0c;我们把1970 年 1 月 1 日 00:00:00定为基准时间&#xff0c;每个度量单位是毫秒(1秒的千分之一)&#xff0c;如图所示。…

ARMv8-A MacOS调试环境搭建

文章目录 简介安装qemu交叉编译工具链C语言插件 gdb调试测试代码添加调试配置 JLink 调试树莓派 简介 本节主要介绍基于Visual Studio Code在MacOS下调试环境的搭建&#xff0c;Linux发行版上的过程也类型&#xff0c;它主要使用到以下工具链&#xff1a; aarch64 架构的交叉…

万字长文解读深度学习——dVAE(DALL·E的核心部件)

&#x1f33a;历史文章列表&#x1f33a; 深度学习——优化算法、激活函数、归一化、正则化 深度学习——权重初始化、评估指标、梯度消失和梯度爆炸 深度学习——前向传播与反向传播、神经网络&#xff08;前馈神经网络与反馈神经网络&#xff09;、常见算法概要汇总 万字长…

Javaweb 前端 ajax

作用&#xff1a;和后端交互 script 是 js axios(这里是函数的调用方式){封装的是对象} {}是对象 案例 。then的含义&#xff0c;请求后端之后&#xff0c;后端把数据放在回调 点了清空之后&#xff0c;还要查询全部 await等待请求执行完之后&#xff0c;接收这个结果 代码…

IdentityServer4框架、ASP.NET core Identity

OAuth2.0 IdentityServer4 ASP.NET Core Identity提供了一个用来管理和存储用户账户的框架. IdentityServer4是基于ASP.NET Core实现的认证和授权框架&#xff0c;是对OpenID Connect和OAuth 2.0协议的实现。 IdentityServer是一个中间件,它可以添加符合OpenID Connect和OAut…

Linux系统nginx版本升级

最近公司漏扫有涉及到需要升级nginx的部分, 以下是一些总结经验 检查当前nginx版本 执行命令: nginx -V 如果没有设置环境变量则需要进入到nginx目录sbin目录下执行: ./nginx -V 下载最新版nginx nginx下载地址: https://nginx.org/en/download.html 1)选择稳定版本 wget h…

给建筑物“穿毛衣”:AI绘图新玩法

随着气温的骤降&#xff0c;我们不仅感受到了自然界的寒冷&#xff0c;甚至连城市的建筑物似乎也在寒风中“颤抖”。在这样的背景下&#xff0c;一种新颖的AI绘图玩法——给建筑“穿毛衣”在网络上迅速走红。本文将详细介绍这一创意玩法&#xff0c;并提供手把手的教学指导。 A…

第2章:CSS基本语法 --[CSS零基础入门]

CSS(层叠样式表,Cascading Style Sheets)是用来描述HTML或XML(包括各种XML:SVG, MathML 或 XHTML)等文档的外观和格式的语言。以下是CSS的基本语法: 1.选择器 1.元素选择器 元素选择器是基于HTML标签名称来选择元素的。当你使用元素选择器时,你是在告诉浏览器对页面…

SpringMvc完整知识点二(完结)

SpringMVC获取请求参数 环境准备工作等均省略&#xff0c;可详见快速入门&#xff0c;此处只写非共有部分代码 该部分示例项目SpringMvcThree已上传至Gitee&#xff0c;可自行下载 客户端请求参数的格式为&#xff1a;namevalue&passwordvalue... ... 服务端想要获取请求…

Spring完整知识点一

Spring简介 额外知识点 在之前的学习中我们在Service业务层创建Dao/Mapper数据访问层&#xff08;持久层&#xff09;的对象是通过工具类来获取对应Dao/Mapper数据访问层&#xff08;持久层&#xff09;的接口代理对象在此处我们不用工具类来获取对应Dao/Mapper数据访问层&…

Jupyter Notebook认识、安装和启动以及使用

Jupyter Notebook认识、安装和启动以及使用 Jupyter Notebook认识、安装和启动以及使用 Jupyter Notebook认识、安装和启动以及使用一、认识Jupyter Notebook1.1 Jupyter Notebook概述1.2 Jupyter Notebook 重要特性(1)交互式代码执行(2)支持多种编程语言(3)富文本编辑(4)代码高…

React 组件中 State 的定义、使用及正确更新方式

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;React篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来React篇专栏内容React 组件中 State 的定义、使用及正确更新方式 前言 在 React 应用开发中&#xff0c;state …