十四天学会C++之第三天(数组和字符串)

news2025/4/28 1:16:45

在这里插入图片描述

1. 数组的定义和初始化

数组是一种由相同数据类型的元素组成的集合,这些元素按照一定的顺序存储在连续的内存位置上。数组的大小在创建时是固定的,无法在运行时改变。

在C++中,数组的定义和声明非常简单。定义一个数组:

数据类型 数组名[数组大小];

数据类型可以是整数、浮点数、字符等,数组名是你为数组取的名字,数组大小表示数组可以容纳的元素数量。示例:

int numbers[5];          // 整数数组,包含5个元素
double temperatures[7];  // 浮点数数组,包含7个元素
char vowels[5];          // 字符数组,包含5个元素

数组的初始化。数组可以在声明时进行初始化,也可以后期赋值。静态初始化是在声明时提供初始值,动态初始化是在声明后使用赋值语句赋初值。

静态初始化:

int numbers[5] = {1, 2, 3, 4, 5}; // 静态初始化,包含5个整数

动态初始化:

double temperatures[7];  // 声明数组
temperatures[0] = 98.6;  // 动态初始化第一个元素
temperatures[1] = 95.5;  // 动态初始化第二个元素
// 以此类推...

2. 数组的基本操作

访问数组元素: 要访问数组中的元素,使用数组名称后跟方括号,方括号中包含元素的索引(从0开始)。访问数组中的第一个元素:

int numbers[5] = {1, 2, 3, 4, 5};
int firstNumber = numbers[0]; // 访问第一个元素

修改数组元素: 修改数组中的元素,使用相同的索引来指定要修改的元素,并分配一个新的值给它。修改数组中的第三个元素:

int numbers[5] = {1, 2, 3, 4, 5};
numbers[2] = 100; // 修改第三个元素的值为100

获取数组长度: C++中,获取数组的长度可以使用sizeof运算符来实现。获取上面数组numbers的长度:

int length = sizeof(numbers) / sizeof(numbers[0]);

返回数组中元素的数量,在循环等操作中控制数组的访问。

数组的遍历: 遍历数组意味着访问数组的每个元素。通过循环来完成,最常见的是使用for循环。遍历数组并打印每个元素的示例:

int numbers[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
    cout << numbers[i] << " "; // 打印每个元素
}

3. 字符串的处理

引入字符串的概念: 字符串是一组字符的序列,表示文本数据。在C++中,有两种主要的字符串表示方式:C-风格字符串和C++字符串类。

C-风格字符串: C-风格字符串实际上是字符数组,以空字符'\0'结尾。例如:

char greeting[] = "Hello, World!";

C-风格字符串需要手动处理字符串的长度和内存分配。

C++字符串类: C++提供了一个名为std::string的字符串类,它是C-风格字符串的现代替代品。使用字符串类,可以方便地处理字符串,无需担心内存管理和长度问题。

#include <string>
std::string greeting = "Hello, World!";

字符串的基本操作: 无论是C-风格字符串还是C++字符串类,都支持基本的字符串操作,如拼接、查找子串、比较等。示例:

  • 拼接字符串:
std::string firstName = "John";
std::string lastName = "Doe";
std::string fullName = firstName + " " + lastName;
  • 查找子串:
std::string sentence = "This is a sample sentence.";
size_t found = sentence.find("sample");
if (found != std::string::npos) {
    std::cout << "Found 'sample' at position " << found << std::endl;
}
  • 比较字符串:
std::string str1 = "apple";
std::string str2 = "banana";
int result = str1.compare(str2);
if (result == 0) {
    std::cout << "Strings are equal." << std::endl;
} else if (result < 0) {
    std::cout << "str1 is less than str2." << std::endl;
} else {
    std::cout << "str1 is greater than str2." << std::endl;
}

4. C-风格字符串和C++字符串类

对比C-风格字符串和C++字符串类:

  • C-风格字符串(字符数组):
    • 使用字符数组表示,以null字符('\0')结尾。
    • 需要手动管理内存和长度。
    • 操作较为繁琐,容易造成越界和内存泄漏。
char greeting[20] = "Hello, World!";
  • C++字符串类 (std::string):
    • 使用现代C++标准库提供的std::string类。
    • 自动管理内存,不需要担心内存分配和释放。
    • 提供丰富的字符串操作方法,更安全和高效。
#include <string>
std::string greeting = "Hello, World!";

C++字符串类的常见操作:

  • 拼接字符串:
std::string str1 = "Hello, ";
std::string str2 = "World!";
std::string greeting = str1 + str2;  // "Hello, World!"
  • 查找子串:
std::string sentence = "This is a sample sentence.";
size_t found = sentence.find("sample");
if (found != std::string::npos) {
    std::cout << "Found 'sample' at position " << found << std::endl;
}
  • 替换子串:
std::string sentence = "The quick brown fox jumps over the lazy dog.";
sentence.replace(10, 5, "red");  // Replace "brown" with "red"

5. 示例和练习

示例 1:使用数组存储一组数字,并计算它们的平均值。

#include <iostream>

int main() {
    int numbers[] = {10, 20, 30, 40, 50};
    int sum = 0;

    for (int i = 0; i < 5; i++) {
        sum += numbers[i];
    }

    double average = static_cast<double>(sum) / 5;
    std::cout << "Average: " << average << std::endl;

    return 0;
}

运行结果:
在这里插入图片描述

示例 2:使用字符串处理用户输入的姓名,并输出欢迎消息。

#include <iostream>
#include <string>

int main() {
    std::string name;
    std::cout << "Enter your name: ";
    std::cin >> name;
    std::cout << "Welcome, " << name << "!" << std::endl;

    return 0;
}

运行结果:
在这里插入图片描述

练习题:

  1. 创建一个整数数组,存储一组学生的考试成绩,并计算平均分。

  2. 编写一个程序,要求用户输入一个句子,然后统计句子中的单词数。

  3. 使用C++字符串类,编写一个程序,将两个字符串拼接在一起,并输出结果。

  4. 创建一个字符数组,存储你喜欢的一句名言,并编写程序将其中的某个单词替换为其他单词。

问题 1:创建一个整数数组,存储一组学生的考试成绩,并计算平均分。

#include <iostream>

int main() {
    const int numStudents = 5; // 假设有5名学生
    int scores[numStudents];
    int sum = 0;

    // 输入学生的成绩
    for (int i = 0; i < numStudents; i++) {
        std::cout << "输入第 " << i + 1 << " 名学生的成绩:";
        std::cin >> scores[i];
        sum += scores[i];
    }

    double average = static_cast<double>(sum) / numStudents;
    std::cout << "平均分:" << average << std::endl;

    return 0;
}

运行结果:在这里插入图片描述

问题 2:编写一个程序,要求用户输入一个句子,然后统计句子中的单词数。

#include <iostream>
#include <string>

int main() {
    std::string sentence;
    int wordCount = 0;

    std::cout << "请输入一个句子:";
    std::getline(std::cin, sentence);

    // 通过空格切分句子并统计单词数
    for (char c : sentence) {
        if (c == ' ') {
            wordCount++;
        }
    }

    // 最后一个单词后没有空格,所以需要额外加一
    wordCount++;

    std::cout << "单词数:" << wordCount << std::endl;

    return 0;
}

运行结果:在这里插入图片描述

问题 3:使用C++字符串类,编写一个程序,将两个字符串拼接在一起,并输出结果。

#include <iostream>
#include <string>

int main() {
    std::string str1 = "Hello, ";
    std::string str2 = "World!";
    std::string result = str1 + str2;

    std::cout << result << std::endl;

    return 0;
}

运行结果:在这里插入图片描述

问题 4:创建一个字符数组,存储你喜欢的一句名言,并编写程序将其中的某个单词替换为其他单词。

#include <iostream>
#include <cstring>

int main() {
    char quote[] = "生活不止眼前的苟且,还有诗和远方。";
    const char* wordToReplace = "苟且";
    const char* replacement = "快乐";

    // 查找目标单词的位置
    char* found = std::strstr(quote, wordToReplace);

    if (found) {
        // 找到目标单词,进行替换
        int position = found - quote;
        std::strcpy(quote + position, replacement);
    }

    std::cout << quote << std::endl;

    return 0;
}

运行结果:
在这里插入图片描述

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

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

相关文章

基于被囊群优化的BP神经网络(分类应用) - 附代码

基于被囊群优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于被囊群优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.被囊群优化BP神经网络3.1 BP神经网络参数设置3.2 被囊群算法应用 4.测试结果&#x…

实验四 内核线程管理-实验部分

目录 一、知识点 1.进程 1.1.进程定义 1.2.内存中的进程 1.3.进程的组成 1.4.进程的特点 1.5.进程与程序的联系 1.6.进程与程序的区别 2.进程控制块 2.1.进程控制块的使用 2.2.进程控制信息 2.3.进程控制块的组织 3.线程 3.1.为什么引入线程&#xff1f; 3.2.线…

XXPermissions权限请求框架

官网 项目地址&#xff1a;Github博文地址&#xff1a;一句代码搞定权限请求&#xff0c;从未如此简单 框架亮点 一马当先&#xff1a;首款适配 Android 13 的权限请求框架简洁易用&#xff1a;采用链式调用的方式&#xff0c;使用只需一句代码体积感人&#xff1a;功能在同类…

智慧公厕整体解决方案,厕所革命实施方案的范本

随着城市化进程的不断加快&#xff0c;智慧城市应用正成为未来城市发展的重要方向。其中&#xff0c;智慧公厕作为城市基础设施的重要组成部分&#xff0c;其建设范本已经成为各建设中的智慧城市不可或缺的重要内容。那么&#xff0c;如何打造智慧公厕整体解决方案&#xff1f;…

C语言判断语句

判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;。 C 语言把任何非零和非空的值假定为 true&#xff0c;把零或 null 假定为 false。 下面…

【C++】设计模式之——建造者

建造者模式概念模拟实现建造者模式代码实现 建造者模式 首先先大体了解一下&#xff0c;建造者模式是什么意思&#xff0c;它是怎么实现的&#xff1f; 首先&#xff0c;建造者模式是一种创建型设计模式再一个它是使用多个简单的对象一步一步的搭建出一个复杂的对象它可以将一个…

【已解决】RuntimeError Java gateway process exited before sending its port number

RuntimeError: Java gateway process exited before sending its port number 问题 思路 &#x1f3af;方法一 在代码前加入如下代码&#xff08;如图&#xff09;&#xff1a; import os os.environ[‘JAVA_HOME’] “/usr/local/jdk1.8.0_221” # 记得把地址改成自己的 …

MQTT 服务器搭建(基于mosquitto)

1、前言 MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布/订阅&#xff08;publish/subscribe&#xff09;模式的"轻量级"通讯协议&#xff0c;该协议构建于TCP/IP协议上&#xff0c;…

【pwn入门】用gdb实现第1个pwn

声明 本文是B站你想有多PWN学习的笔记&#xff0c;包含一些视频外的扩展知识。 有问题的源码 #include <stdio.h> #include <stdlib.h> #include <unistd.h> char sh[]"/bin/sh"; int func(char *cmd){system(cmd);return 0; }int main(){char …

3.Tensors For Beginners- Forward and Backward Transformations

张量在不同坐标系之间来回移动的规则究竟如何。 之前说过&#xff0c;张量在坐标系变化下是不变的&#xff0c;故了解如何在坐标系之间来回移动对理解张量很重要。 Forward&#xff1a;旧基 到 新基 old basis&#xff1a;旧基 这是在二维坐标系下的两组基。 线性代数中的基…

MySQL面试题合集

MySQL面经知识整理 文章目录 MySQL面经知识整理一、查询相关1.什么是MySQL的连接查询&#xff0c;左连接&#xff0c;右连接&#xff0c;内外连接2.SQL慢查询优化的方法3.大表查询如何优化 二、索引相关1.在MySQL中,可以通过哪些命令来查看查询是否使用了索引2.MySQL的最左匹配…

软件测试教程 自动化测试selenium篇(二)

掌握Selenium常用的API的使用 一、webdriver API public class Main {public static void main(String[] args) {ChromeOptions options=new ChromeOptions();//参数表示允许所有请求options.addArguments("--remote-allow-origins=*");WebDriver webDriver=new Chr…

宠物医院必备,介绍一款宠物疫苗接种管理软件

在当今社会&#xff0c;养宠物已经成为越来越多人的生活方式&#xff0c;宠物疫苗接种已是宠物医院的重要工作&#xff0c;但是目前绝大多数的宠物医院对疫苗接种的管理&#xff0c;还是采取人工登记方式&#xff0c;不仅效率低下&#xff0c;而且无法做到疫苗接种到期自动提醒…

力扣-350.两个数组的交集||

Idea 首先遍历第一个数组&#xff0c;用哈希表存储每个数字及其出现的次数。 然后遍历第二个数组&#xff0c;每出现重复的数字&#xff0c;并判断该数字在哈希表的次数是不是大于0&#xff0c;如果大于则存入答案数组&#xff0c;并将哈希表次数减1&#xff0c;直接遍历结束。…

微信公众号开发基本流程(记录初级流程)

微信公众号开发基本流程 一、注册公众号二、了解公众号管理页面三、必备开发者工具的使用1. 开发者文档2. 在线接口调试工具3. Web开发者工具4. 公众平台测试账号 四、细读开发者文档五、开发流程重点解析1. 开发环境准备2. 服务器基本配置3. 存取access_token参数4. 公众号消息…

第一百六十二回 PopupMenuButton组件

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了Sliver综合示例相关的内容&#xff0c;本章回中将介绍 PopupMenuButton组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在本章回中介绍的PopupMenuButton组件位于AppBar右侧&#xff0c;通常显…

基于蜉蝣优化的BP神经网络(分类应用) - 附代码

基于蜉蝣优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于蜉蝣优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.蜉蝣优化BP神经网络3.1 BP神经网络参数设置3.2 蜉蝣算法应用 4.测试结果&#xff1a;5.M…

【算法训练-二分查找 一】二分查找、在排序数组中查找元素的第一个和最后一个位置

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是螺旋矩阵&#xff0c;使用【二维数组】这个基本的数据结构来实现 二分查找【EASY】 从最简单的二分查找入手&#xff0c;进而开始解决一系列其变体…

网络摄像头(IPC)介绍:类型、供电、镜头、夜视等

IPC&#xff08;Internet Protocol Camera&#xff0c;网络摄像头&#xff09;&#xff0c;它是一种由传统摄像机与网络技术结合所产生的新一代摄像机。它可以将视频、音频、报警及控制信号通过网络传输&#xff0c;接受网络监控主机&#xff08;NVR或监控管理平台&#xff09;…

GitHub与GitHubDesktop的使用

1、介绍 见天来学习使用GitHub与GitHubDesktop。 学习前先来介绍一下什么是GitHub。 GitHub是一个基于Git的代码托管平台和开发者社区。它提供了一个Web界面&#xff0c;让开发者能够轻松地托管、共享和管理他们的软件项目。 在GitHub上&#xff0c;开发者可以创建自己的代…